Android后退按钮在片段中无法正常工作

3

我是android的新手,在MainActivity中我被称为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();
6个回答

5
如果您正在使用工具栏返回按钮,请确保在您的片段中包含以下代码:
@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);
    }

嗯,这很奇怪。我有一个项目,在那里我不这样做,但它仍然弹回来。 - lasec0203

3
这段代码对我有用。
@Override
public void onBackPressed(){
  if (getSupportFragmentManager().getBackStackEntryCount() == 1){
    finish();
  }
  else {
    super.onBackPressed();
  }
}

在我所涉及的Activity中,我添加了以下代码到AndroidManifest.xml文件中,这对我起作用了:<activity ...android:parentActivityName="ParentActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.ParentActivity" /> </activity> - CanCoder

0
  1. 非常简单,只需在导航片段后面添加 null,并在此之后添加 .addToBackStack(null).commit()

  2. 最重要的是,您必须在所有地方添加相同的内容。(R.id.name,fragment(),null).addToBackStack(null).commit()

requireFragmentManager().beginTransaction()
                .replace(R.id.fragmentContainerView, SingUpFragment(),null).addToBackStack(null).commit()

0

你的片段已经被添加到后台堆栈中。但是你需要在Android设备上'Pop The Backstack' 一次,才能让你添加到后台堆栈中的片段显示出来。 只需在你的Activity的onBackPressed()方法中添加这些代码行即可。

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

0

来自主活动:

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

来自片段1:

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

0

注意:始终先将第一个片段添加到事务中,然后替换事务中的每个片段,为了返回到上一个片段,您必须按照下面的步骤将该片段添加到后退堆栈中

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接