【问题标题】:How to handle onBackPressed() in multiple fragment如何在多个片段中处理 onBackPressed()
【发布时间】:2017-07-10 09:40:30
【问题描述】:

我是 Android 初学者,我正在开发一个应用程序,其中我通过一个活动使用了多个片段。

private void displaySelectedScreen(int itemId) {
        Fragment fragment = null;
        switch (itemId) {

            case R.id.nav_home:
                fragment = new HomeFragment();
                break;

            case R.id.nav_attendance:
                fragment = new AttendanceFragment();
                break;

            case R.id.nav_notification:
                fragment = new NotificationFragment();
                break;

            case R.id.nav_event:
               fragment = new EventFragment();
                break;

            case R.id.nav_fee:
               fragment = new FeesFragment();
                break;

            case R.id.nav_news:
                fragment = new NewsFragment();
                break;

        }
        if (fragment != null) {
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.frame_container, fragment);
            ft.addToBackStack(null);
            ft.commit();
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);

    }

如果抽屉已经关闭,则使用onBackPressed() 方法关闭应用程序。现在,如果当前片段是HomeFragment 并且如果当前片段不是HomeFragment,那么我想关闭一个应用程序,然后替换为HomeFragment。不知道,效果如何?

public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        closeApp();
    }
}

【问题讨论】:

  • 在按下返回按钮时检查碎片的数量。从堆栈中弹出片段,直到到达第 0 个片段。检查一个条件,判断栈的大小是否为0。如果是,则结束activity。

标签: android android-fragments drawerlayout android-drawer


【解决方案1】:

您可以将标签添加到您的片段。这样,您只需检查标签名称。

Fragment fragment = new Fragment();
getFragmentManager().beginTransaction()
    .replace(R.id.FrameLayoutId,fragment,"TAG_NAME")
    .addToBackStack("SOURCE_TAG_NAME").commit(); 

这是检查你的片段标签的方法,把这个检查放在你的 backpress 方法上或者你的 closeApp() 方法中

function void closeApp(){
    Fragment fragment = getFragmentManager().findFragmentByTag("HomeActivity");
    if (fragment != null) {
        if(fragment.isVisible()){
            HomeActivity.this.finish(); 
        }
    }
}

【讨论】:

    【解决方案2】:

    在 NavigationActivity 中使用此代码 onBackPressed() 方法。希望能解决你的问题。

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            Fragment f = getVisibleFragment();// to get which fragment now 
            if (f.getClass() != MainFragment.class) {
                Fragment fragment = null;
                try {
                    fragment = (Fragment) MainFragment.class.newInstance();
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
                FragmentManager fragmentManager = getSupportFragmentManager();
                fragmentManager.beginTransaction().replace(R.id.frame, fragment).commit(); // this is your framelayout
            }else {
                super.onBackPressed();
            }
    
        }
    }
    

    getVisibleFragment() 函数

    public Fragment getVisibleFragment() {
        FragmentManager fragmentManager = NavigationActivity.this.getSupportFragmentManager();
        List<Fragment> fragments = fragmentManager.getFragments();
        if (fragments != null) {
            for (Fragment fragment : fragments) {
                if (fragment != null && fragment.isVisible())
                    return fragment;
            }
        }
        return null;
    }
    

    【讨论】:

      【解决方案3】:

      为简单起见,只需转到您的HomeFragment.java 并编辑方法onBackPressed() 以使用finish() 退出应用程序。
      而对于其他Fragment.java,只需使用popBackStack()功能,您可以在这里搜索: https://developer.android.com/reference/android/app/FragmentManager.html#popBackStack()

      【讨论】:

        【解决方案4】:

        在您的 MainActivity 类中覆盖 onBackPressed 并在那里显示对话框,如下所示:

        @Override
        public void onBackPressed() {
            //show dialog box here 
        }
        

        在每个Fragment 中使用以下代码实现onResume() 方法:

             @Override
            public void onResume() {
                super.onResume();
                getView().setFocusableInTouchMode(true);
                getView().requestFocus();
                getView().setOnKeyListener(new View.OnKeyListener() {
                    @Override
                    public boolean onKey(View v, int keyCode, KeyEvent event) {
                        if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
                      //homefragment class name     
                      Class fragmentClass = HomeFragment.class;
        
                     try {
        
                     Fragment  fragment = (Fragment) fragmentClass.newInstance();
                     FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                                fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            return true;
        
                        }
        
                        return false;
                    }
                });
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-08
          • 1970-01-01
          • 1970-01-01
          • 2011-07-14
          相关资源
          最近更新 更多