如何使用回pressed选择片段片段的android [英] How to use back pressed options fragment to fragment in android

查看:141
本文介绍了如何使用回pressed选择片段片段的android的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

返回preSS不会从片段努力片段。(我的应用程序中包含导航抽屉标签视图)给出我的主要活动code below.i添加了回来preSS方法,请大家帮帮忙我....

 公共类主要活动延伸活动{                ImageView的形象;
                私人DrawerLayout mDrawerLayout;
                私人的ListView mDrawerList;
                私人ActionBarDrawerToggle mDrawerToggle;
                //导航抽屉称号
                私人CharSequence的mDrawerTitle;
                //用于存储应用程序标题
                私人CharSequence的mTitle;
                //滑动菜单项
                私有String [] navMenuTitles;
                私人TypedArray navMenuIcons;
                私人的ArrayList< NavDrawerItem> navDrawerItems;
                私人NavDrawerListAdapter适配器;                ExpandableListView expListView;                @覆盖
                保护无效的onCreate(捆绑savedInstanceState){
                    super.onCreate(savedInstanceState);
                    的setContentView(R.layout.activity_main);                    调用Runtime.getRuntime()maxMemory()。
                    //负荷滑动菜单项
                    navMenuTitles = getResources()getStringArray(R.array.nav_drawer_items)。                    从资源//导航抽屉图标
                    navMenuIcons = getResources()
                            .obtainTypedArray(R.array.nav_drawer_icons);                    mDrawerLayout =(DrawerLayout)findViewById(R.id.drawer_layout);
                    mDrawerList =(ListView控件)findViewById(R.id.list_slidermenu);
                    navDrawerItems =新的ArrayList< NavDrawerItem>();
                    //首页
                    navDrawerItems.add(新NavDrawerItem(navMenuTitles [0],navMenuIcons.getResourceId(0,-1)));
                    //找人
                    navDrawerItems.add(新NavDrawerItem(navMenuTitles [1],navMenuIcons.getResourceId(1,-1)));
                    // 相片
                    navDrawerItems.add(新NavDrawerItem(navMenuTitles [2],navMenuIcons.getResourceId(2,-1)));
                    //社区,这里将添加计数器
                    navDrawerItems.add(新NavDrawerItem(navMenuTitles [3],navMenuIcons.getResourceId(3,-1)));
                    //网页
                    navDrawerItems.add(新NavDrawerItem(navMenuTitles [4],navMenuIcons.getResourceId(4,-1)));
                    //什么是热的,我们将在这里添加计数器
                    navDrawerItems.add(新NavDrawerItem(navMenuTitles [5],navMenuIcons.getResourceId(5,-1)));
                    navDrawerItems.add(新NavDrawerItem(navMenuTitles [6],
                    //回收类型数组
                    navMenuIcons.recycle();                    mDrawerList.setOnItemClickListener(新SlideMenuClickListener());
                   // mDrawerLayout.setBackgroundDrawable(新ColorDrawable(R.drawable.border));
                    //设置导航抽屉名单适配器
                    适配器=新NavDrawerListAdapter(getApplicationContext()
                            navDrawerItems);
                    mDrawerList.setAdapter(适配器);
                    动作条动作条= getActionBar();
                    //使操作栏中的应用程序图标和行为作为切换按钮
                    getActionBar()setDisplayHomeAsUpEnabled(真)。
                    getActionBar()setHomeButtonEnabled(真)。
                    actionBar.setHomeButtonEnabled(真);
                    actionBar.setBackgroundDrawable(新ColorDrawable(Color.WHITE));                    actionBar.setCustomView(R.layout.custom_view);
                    // actionBar.setCustomView(R.layout.custom_view1);
                    actionBar.setDisplayShowCustomEnabled(真);
                    actionBar.show();
                    addListenerOnButton();                    mDrawerToggle =新ActionBarDrawerToggle(这一点,mDrawerLayout,
                            R.drawable.draw,//导航菜单切换图标
                            R.string.app_name,//导航抽屉打开 - 描述的可访问性
                            R.string.app_name //导航抽屉接近 - 描述的可访问性
                    ){
                        公共无效onDrawerClosed(查看视图){
                            。getActionBar()的setTitle(mTitle);
                            //调用prepareOptionsMenu()来显示操作栏图标
                            invalidateOptionsMenu();
                        }                        公共无效onDrawerOpened(查看drawerView){
                            。getActionBar()的setTitle(mDrawerTitle);
                            //调用prepareOptionsMenu()隐藏操作栏图标
                            invalidateOptionsMenu();
                        }
                    };
                    mDrawerLayout.setDrawerListener(mDrawerToggle);                    如果(savedInstanceState == NULL){
                        //对第一个项目的资产净值首次显示视图
                        displayView(0);
                    }
                }                / **
                 *滑动菜单项,点击监听器
                 * * /                私有类SlideMenuClickListener工具
                        ListView.OnItemClickListener {
                    @覆盖
                    公共无效onItemClick(适配器视图<>母公司,观景,INT位置,
                            长ID){
                        //选定导航抽屉项显示视图
                        displayView(位置);
                    }
                }                @覆盖
                公共布尔onCreateOptionsMenu(菜单菜单){
                    。getMenuInflater()膨胀(R.menu.main,菜单);
                    返回true;
                }                @覆盖
                公共布尔onOptionsItemSelected(菜单项项){
                    //切换上选择操作栏中的应用程序图标/标题导航抽屉
                    如果(mDrawerToggle.onOptionsItemSelected(项目)){                    }                    返回true;                }
                / **
                 所选导航抽屉列表项* Diplaying片段视图
                 * * /
                私人无效displayView(INT位置){
                    //更新替换片段的主要内容
                    片段片段= NULL;                    开关(位置){
                    情况下0:
                         片段=新FirstFragment();
                         打破;
                    情况1:
                         片段=新HomeFragment();
                         打破;
                    案例2:
                        片段=新FindPeopleFragment();
                        打破;
                    案例3:
                        片段=新PhotosFragment();
                        打破;
                    情况4:
                        片段=新PagesFragment();
                        打破;
                    情况5:
                        片段=新CommunityFragment();
                        打破;                    默认:
                        打破;
                    }
 **编辑code:**如果(片段!= NULL){
             FragmentManager fragmentManager = getFragmentManager();             FragmentTransaction英尺= fragmentManager.beginTransaction();             ft.addToBackStack(NULL);
             ft.replace(R.id.frame_container,片段);            //这个交易添加到后面堆栈,因此当用户presses回来,//它回滚。            ft.commit();                        //更新所选项目和标题,然后关上抽屉
                        mDrawerList.setItemChecked(位置,真正的);
                        mDrawerList.setSelection(位置);
                        (navMenuTitles [位置])的setTitle;
                        mDrawerLayout.closeDrawer(mDrawerList);
                    }其他{
                        //错误创建片段
                        Log.e(MainActivity,出错创建片段);
                    }                }
                @覆盖
                公共无效的setTitle(CharSequence的标题){
                    mTitle =称号;
                    。getActionBar()的setTitle(mTitle);
                }                私人无效addListenerOnButton(){
                    // TODO自动生成方法存根                    图像=(ImageView的)findViewById(R.id.actionBarLogo);                    image.setOnClickListener(新OnClickListener(){                        @覆盖
                        公共无效的onClick(视图v){                            片段FD2 =新MovieActivity();
                            android.app.FragmentTransaction平方英尺=
                                    。getFragmentManager()的BeginTransaction();
                                          ft2.replace(R.id.frame_container,FD2​​);
                                          ft2.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                                          ft2.addToBackStack(NULL);
                                          ft2.commit();
                        }
                    });
                }
                @覆盖
                公共无效onBack pressed(){
            诠释计数= getFragmentManager()getBackStackEntryCount()。
            如果(计数== 0){
            super.onBack pressed();
            }
            其他{
                getFragmentManager()popBackStack()。
               }
        }
                @覆盖
                保护无效onPostCreate(捆绑savedInstanceState){
                    super.onPostCreate(savedInstanceState);
                    //同步onRestoreInstanceState后切换状态已经发生。
                    mDrawerToggle.syncState();
                }                @覆盖
                公共无效onConfigurationChanged(配置NEWCONFIG){
                    super.onConfigurationChanged(NEWCONFIG);
                    //把任何配置更改抽屉toggls
                    mDrawerToggle.onConfigurationChanged(NEWCONFIG);
                }            }


解决方案

在你的活动负责处理所有的片段,用

  @覆盖
公共无效onBack pressed(){
    诠释计数= getSupportFragmentManager()getBackStackEntryCount()。
    如果(计数== 0){
    super.onBack pressed();
    }
    其他{
          getSupportFragmentManager()popBackStack()。
       }
}

在片段backstack项数为0,这意味着所有的片段被弹出了backstack的。所以,你只需要执行 super.onBack pressed()即可。然而,当栈不为空,当你preSS后退按钮,你需要从backstack弹出最顶层的片段,使正确的后退导航发生。

注意:使用 getFragmentManager()getBackStackEntryCount()而不是 getSupportFragmentManager()getBackStackEntryCount()如果您导入 android.app.Fragment

修改

现在你已经改变了你的 onBack pressed() code,接下来要做的事情是在你的code改变这一点。

 如果(片段!= NULL){
     FragmentManager fragmentManager = getFragmentManager();     FragmentTransaction英尺= fragmentManager.beginTransaction();     ft.replace(R.id.frame_container,片段);    //这个交易添加到后面堆栈,因此当用户presses回来,//它回滚。    ft.addToBackStack(给该片段的标签在这里);
    ft.commit();                //更新所选项目和标题,然后关上抽屉
                mDrawerList.setItemChecked(位置,真正的);
                mDrawerList.setSelection(位置);
                (navMenuTitles [位置])的setTitle;
                mDrawerLayout.closeDrawer(mDrawerList);
            }其他{
                //错误创建片段
                Log.e(MainActivity,出错创建片段);
            }

基本上我们在这里做的是增加特定片段的片段backstack而取代它,这样当 onBack pressed()被执行活动的计数变量将片段present的号码存储在片段backstack,然后适当后退导航时发生。

Back press is not working from fragment to fragment.(my application contains navigation drawer and Tab view.) My Main Activity code is given below.i have added the back press method please help me....

            public class Main Activity extends Activity   {

                ImageView image;
                private DrawerLayout mDrawerLayout;
                private ListView mDrawerList;
                private ActionBarDrawerToggle mDrawerToggle;
                // nav drawer title
                private CharSequence mDrawerTitle;
                // used to store app title
                private CharSequence mTitle;
                // slide menu items
                private String[] navMenuTitles;
                private TypedArray navMenuIcons;
                private ArrayList<NavDrawerItem> navDrawerItems;
                private NavDrawerListAdapter adapter;

                ExpandableListView expListView;

                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);

                    Runtime.getRuntime().maxMemory();
                    // load slide menu items
                    navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

                    // nav drawer icons from resources
                    navMenuIcons = getResources()
                            .obtainTypedArray(R.array.nav_drawer_icons);

                    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
                    mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
                    navDrawerItems = new ArrayList<NavDrawerItem>();
                    // Home
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[0],  navMenuIcons.getResourceId(0, -1)));
                    // Find People
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[1],  navMenuIcons.getResourceId(1, -1)));
                    // Photos
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[2],  navMenuIcons.getResourceId(2, -1)));
                    // Communities, Will add a counter here
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[3],  navMenuIcons.getResourceId(3, -1)));
                    // Pages
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[4],  navMenuIcons.getResourceId(4, -1)));
                    // What's hot, We  will add a counter here
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[5],  navMenuIcons.getResourceId(5, -1)));
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[6],  
                    // Recycle the typed array
                    navMenuIcons.recycle();

                    mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
                   // mDrawerLayout.setBackgroundDrawable(new ColorDrawable(R.drawable.border));
                    // setting the nav drawer list adapter
                    adapter = new NavDrawerListAdapter(getApplicationContext(),
                            navDrawerItems);
                    mDrawerList.setAdapter(adapter);
                    ActionBar actionBar = getActionBar();
                    // enabling action bar app icon and behaving it as toggle button
                    getActionBar().setDisplayHomeAsUpEnabled(true);
                    getActionBar().setHomeButtonEnabled(true);
                    actionBar.setHomeButtonEnabled(true);
                    actionBar.setBackgroundDrawable(new ColorDrawable(Color.WHITE));

                    actionBar.setCustomView(R.layout.custom_view);
                    // actionBar.setCustomView(R.layout.custom_view1);
                    actionBar.setDisplayShowCustomEnabled(true);
                    actionBar.show();
                    addListenerOnButton();

                    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                            R.drawable.draw,//nav menu toggle icon
                            R.string.app_name, // nav drawer open - description for accessibility
                            R.string.app_name // nav drawer close - description for accessibility
                    ) {
                        public void onDrawerClosed(View view) {
                            getActionBar().setTitle(mTitle);
                            // calling onPrepareOptionsMenu() to show action bar icons
                            invalidateOptionsMenu();
                        }

                        public void onDrawerOpened(View drawerView) {
                            getActionBar().setTitle(mDrawerTitle);
                            // calling onPrepareOptionsMenu() to hide action bar icons
                            invalidateOptionsMenu();
                        }
                    };
                    mDrawerLayout.setDrawerListener(mDrawerToggle);

                    if (savedInstanceState == null) {
                        // on first time display view for first nav item
                        displayView(0);
                    }
                }

                /**
                 * Slide menu item click listener
                 * */

                private class SlideMenuClickListener implements
                        ListView.OnItemClickListener {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {
                        // display view for selected nav drawer item
                        displayView(position);
                    }
                }

                @Override
                public boolean onCreateOptionsMenu(Menu menu) {
                    getMenuInflater().inflate(R.menu.main, menu);
                    return true;
                }

                @Override
                public boolean onOptionsItemSelected(MenuItem item) {
                    // toggle nav drawer on selecting action bar app icon/title
                    if (mDrawerToggle.onOptionsItemSelected(item)) {

                    }

                    return true;

                }


                /**
                 * Diplaying fragment view for selected nav drawer list item
                 * */
                private void displayView(int position) {
                    // update the main content by replacing fragments
                    Fragment fragment = null;

                    switch (position) {
                    case 0:
                         fragment = new FirstFragment();
                         break;
                    case 1:
                         fragment = new HomeFragment();
                         break;
                    case 2:
                        fragment = new FindPeopleFragment();
                        break;
                    case 3:
                        fragment = new PhotosFragment(); 
                        break;
                    case 4:
                        fragment = new PagesFragment();
                        break;
                    case 5:
                        fragment = new CommunityFragment();
                        break;

                    default:
                        break;
                    }
 **Edited Code:**               

if (fragment != null) {
             FragmentManager fragmentManager = getFragmentManager();

             FragmentTransaction ft = fragmentManager.beginTransaction();

             ft.addToBackStack(null);
             ft.replace(R.id.frame_container, fragment);

            // Add this transaction to the back stack, so when the user presses back,// it rollbacks.

            ft.commit();

                        // update selected item and title, then close the drawer
                        mDrawerList.setItemChecked(position, true);
                        mDrawerList.setSelection(position);
                        setTitle(navMenuTitles[position]);
                        mDrawerLayout.closeDrawer(mDrawerList);
                    } else {
                        // error in creating fragment
                        Log.e("MainActivity", "Error in creating fragment");
                    }



                }
                @Override
                public void setTitle(CharSequence title) {
                    mTitle = title;
                    getActionBar().setTitle(mTitle);
                }

                private void addListenerOnButton() {
                    // TODO Auto-generated method stub

                    image = (ImageView) findViewById(R.id.actionBarLogo);

                    image.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {

                            Fragment fd2 = new MovieActivity();


                            android.app.FragmentTransaction  ft2 =
                                    getFragmentManager().beginTransaction();
                                          ft2.replace(R.id.frame_container, fd2); 
                                          ft2.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                                          ft2.addToBackStack(null);
                                          ft2.commit();


                        }
                    });
                }
                @Override
                public void onBackPressed() {
            int count = getFragmentManager().getBackStackEntryCount();
            if (count == 0) {           
            super.onBackPressed();            
            }
            else {            
                getFragmentManager().popBackStack();            
               }
        }
                @Override
                protected void onPostCreate(Bundle savedInstanceState) {
                    super.onPostCreate(savedInstanceState);
                    // Sync the toggle state after onRestoreInstanceState has occurred.
                    mDrawerToggle.syncState();
                }

                @Override
                public void onConfigurationChanged(Configuration newConfig) {
                    super.onConfigurationChanged(newConfig);
                    // Pass any configuration change to the drawer toggls
                    mDrawerToggle.onConfigurationChanged(newConfig);
                }

            }

解决方案

Inside your activity which handles all the fragments , use

@Override
public void onBackPressed() {
    int count = getSupportFragmentManager().getBackStackEntryCount();
    if (count == 0) {           
    super.onBackPressed();            
    }
    else {            
          getSupportFragmentManager().popBackStack();            
       }
}

When the fragment backstack entry count is 0 , it means all the fragments are popped out of the backstack. So you just execute the super.onBackPressed() then. However when the stack is not empty , when you press back button you need to pop the top most fragment from the backstack so that proper back navigation happens.

Note : use getFragmentManager().getBackStackEntryCount() instead of getSupportFragmentManager().getBackStackEntryCount() if you are importing android.app.Fragment.

Edit

Now that you have changed your onBackPressed() code , next thing to do is change this in your code.

  if (fragment != null) {
     FragmentManager fragmentManager = getFragmentManager();

     FragmentTransaction ft = fragmentManager.beginTransaction();

     ft.replace(R.id.frame_container, fragment);

    // Add this transaction to the back stack, so when the user presses back,// it rollbacks.

    ft.addToBackStack("Give a Tag for the fragment here");
    ft.commit();

                // update selected item and title, then close the drawer
                mDrawerList.setItemChecked(position, true);
                mDrawerList.setSelection(position);
                setTitle(navMenuTitles[position]);
                mDrawerLayout.closeDrawer(mDrawerList);
            } else {
                // error in creating fragment
                Log.e("MainActivity", "Error in creating fragment");
            }

Basically what we are doing here is adding a particular fragment to the fragment backstack while replacing it so that while onBackPressed() of activity is executed count variable will store the number of fragments present in the fragment backstack , and proper back navigation occurs then.

这篇关于如何使用回pressed选择片段片段的android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆