【问题标题】:Android back button not working in fragmentAndroid后退按钮在片段中不起作用
【发布时间】:2016-11-03 06:23:50
【问题描述】:

我是 android 新手,我在 MianActivity 中被称为 fragment_1,然后我在 fragment_1 中被称为 fragment_2。那工作正常。当我从 fragment_2 按下返回按钮时,它不起作用(我想回到 fragment_1)

   Fragment someFragment = new Fragment2();
   FragmentTransaction transaction = getFragmentManager().beginTransaction();
   transaction.replace(R.id.relative_layout_to_replace, someFragment );
   transaction.addToBackStack(null);
   transaction.commit();

【问题讨论】:

    标签: android android-fragments fragment


    【解决方案1】:

    如果您使用工具栏后退按钮,那么请确保您的片段中有以下代码:

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //required for back button to work
        setHasOptionsMenu(true);
    }
    

    并且还要重写这个函数:

     @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            Log.i(TAG,"Back Button Pressed");
            switch (item.getItemId()) {
                case android.R.id.home:
                    Log.i(TAG,"home on backpressed");
                    getActivity().onBackPressed();
                    return true;
            }
            return super.onOptionsItemSelected(item);
        }
    

    【讨论】:

    • 嗯,这很奇怪。我有一个项目我不这样做,但它仍然弹出。
    【解决方案2】:

    这段代码对我有用

    @Override
    public void onBackPressed(){
      if (getSupportFragmentManager().getBackStackEntryCount() == 1){
        finish();
      }
      else {
        super.onBackPressed();
      }
    }
    

    【讨论】:

    • 在我将 AndroidManifext.xml 中的代码添加到有问题的 Activity 之后,这对我有用
    【解决方案3】:

    您的片段已被添加到 backstack。但是您需要“Pop The Backstack”一次,以使 Android 设备显示您添加到其 backstack 的片段。 只需在 Activity 的 onBackPressed() 中添加这些代码行

    FragmentManager manager = getSupportFragmentManager();
        if(manager.getBackStackEntryCount() > 0 ) {
            manager.popBackStack();//Pops one of the added fragments
        }
    

    【讨论】:

      【解决方案4】:

      来自主要活动:

      getSupportFragmentManager().beginTransaction()
         .add(R.id.something,new Fragment1()).addToBackStack(null).commit();
      

      来自片段1:

      getActivity().getSupportFragmentManager().beginTransaction()
         .replace(R.id.something,new Fragment2()).addToBackStack(null).commit();
      

      【讨论】:

        【解决方案5】:

        注意:- 始终在事务中添加第一个片段,然后替换事务中的每个片段,为了返回前一个片段,您必须将该片段添加到后台堆栈,如下所示

        FragmentTransaction fragTrans = fragmentManager.beginTransaction();
        fragTrans.addToBackStack("DashboardFragment");
        fragTrans.replace(contentFrameId, openDashBoard, "OpenDashboardFragment");
        

        MainActivity 中的 onBackPressed

        if (fragmentManager.getBackStackEntryCount() == 1) {
              AlertExit();
        } else {
              int backStackId = fragmentManager.getBackStackEntryAt(i).getId();
              fragmentManager.popBackStack(backStackId, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多