【问题标题】:How to go the previous fragment on the click of the back button of phone in android?如何在android中单击手机的后退按钮时转到上一个片段?
【发布时间】:2016-09-22 08:19:51
【问题描述】:

我想回到上一个片段。我尝试了很多方法,比如addtobackstack(null) 等等。但我没有得到解决方案。我的问题是当我单击后退按钮时,它会转到主页片段。但我不想要它。我希望当我单击后退按钮时它会转到上一个片段。谁能告诉我该怎么做?

这是我的onActivityCreated() 方法:-

 @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);

            getView().setOnKeyListener(new View.OnKeyListener() {
                @Override
                public boolean onKey(View view, int i, KeyEvent keyEvent) {
                    if (i == KeyEvent.KEYCODE_BACK) {

                        getFragmentManager().popBackStack();
                        return true;


                    }


                    return false;
                }
            });

        }

这是第一个片段:-

 Fragment fragment = new Packages();
 getActivity().getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.container, fragment).addToBackStack(null).commit();

这是第二个片段:-

  Fragment fragment = new DeliveryFrag();
 mContext.getActivity().getSupportFragmentManager()
                            .beginTransaction()
                            .replace(R.id.container, fragment).addToBackStack(null)
                            .commit();

这是第三个片段:-

Fragment fragment = new paytm();
   getActivity().getSupportFragmentManager().beginTransaction()
                                        .replace(R.id.container, fragment).addToBackStack(null)
                                        .commit();

我正在获取视图并在其上应用集合onClickListner。但是程序没有进入这个方法。我不知道为什么?请问谁能告诉我我做错了什么?

【问题讨论】:

  • @Ironman 我没有从该链接获得解决方案。这就是我再次问的原因。如果你知道答案,请告诉我。
  • 请告诉我们您的导航方式(例如:主页 > 片段 A > 片段 B > ...)
  • @PierGiorgioMisley 我正在像 Home> 片段 A > 片段 B > 片段 C 一样导航,我想从片段 C 转到片段 B。但在我的情况下,我将改为从 C 到主页片段 B。
  • 好的,您能否在答案中添加您用于从 A 到 B 和从 B 到 C 的代码?

标签: android android-fragments back-button


【解决方案1】:

您必须使用fragmentManager.addToBackStack(<fragment tag>).commit(); 将片段保存在堆栈中。然后尝试做getFragmentManager().popBackStack();

【讨论】:

    【解决方案2】:

    你应该在 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 (keyCode == KeyEvent.KEYCODE_BACK) {
    
                        getFragmentManager().popBackStack();
                        return true;
                    }
    
                    return false;
                }
            });
    
        }
    

    【讨论】:

      【解决方案3】:

      像这样公开Fragment

      public Fragment currentFrag = null;
      public Fragment f1 = new Packages();
      public Fragment f2 = new DeliveryFrag();
      public Fragment f3 = new paytm();
      

      然后,在更改Fragment 的按钮上,用下一个填充你的空currentFrag

      @Override
      public void onClick(View v){
      
      if(currentFrag == null || currentFrag == f1){
         //open second fragment code
         currentFrag = f2;
         }else if(currentFrag == f2){
         //open third fragment code
         currentFrag = f3;
         }
      }
      

      然后你在你的主要活动中覆盖onBackPressed() 方法

      @Override
      public void onBackPressed()
      {
        if (currentFrag == f1){
        super.onBackPressed() // close the app
        }else if(currentFrag == f2){
        //calling your first fragment code
        currentFrag = null;
        }else if(currentFrag == f3){
        //calling your second fragment code
        currentFrag = f2;
        }
      }
      

      我希望这会有所帮助,因为即使我也有点困惑

      【讨论】:

        【解决方案4】:

        为我工作......你可以试试这个......可能会帮助你......

        write addToBackStack(null) before commit();
        

        并在您的 onBackPressed() 方法中编写以下代码。

          FragmentManager fm = getSupportFragmentManager();
        
            if (fm.getBackStackEntryCount() > 1) {
                ApplicationLog.Log(TAG,"IN > 1");
                fm.popBackStack(); //will redirect you previous visited fragment
            }
            else if(fm.getBackStackEntryCount()==1)
            {
              finish(); //will close application
            }
        

        【讨论】:

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