【问题标题】:back to previous fragment from other fragment从其他片段返回上一个片段
【发布时间】:2015-07-17 09:52:45
【问题描述】:

我有主要活动和 2 个片段,片段 1 调用片段 2 当我从内置的 android 按钮中单击后退按钮时,它会调用我在主要活动中覆盖的 onBackPressed 函数并退出应用程序。 我希望当我单击片段 2 时,不会调用主要活动的 onBackPressed,它会将我返回到片段 1。 操作栏的后退按钮效果很好(我认为这意味着后退是可以的)。

我尝试过:

getActivity().getSupportFragmentManager().beginTransaction().addToBackStack("Messages");

关于片段 2

并尝试添加

getSupportFragmentManager().popBackStack();

到主要活动的onBackPressed() 它什么也没做 谢谢

编辑:

I am trying to do 
    public void onBackPressed() {
//      getSupportFragmentManager().popBackStack();
        android.support.v4.app.Fragment fragment2 = getSupportFragmentManager().findFragmentByTag(null);
        if (fragment2 != null && fragment2.isVisible()) {
            getSupportFragmentManager().popBackStack();
            return;
        }

在任何演出之前

getSupportFragmentManager().beginTransaction().addToBackStack(null).commit();
        tr.show(Fragment2);

但在 findFragment(null) 上得到了 null

编辑: 我检查了 getSupportFragmentManager().beginTransaction().mTail.fragment 并看到该值是我想要显示的片段 1,但是当我执行 getSupportFragmentManager().popBackStack();它没有任何作用。

【问题讨论】:

  • 我认为默认情况下,当 addBackStack 时,Os 将执行您期望的相同行为,而不会覆盖 onBackPressed。也许你在其他地方错误地实现了,你能发布更多的代码吗?
  • @Minhtdh 是对的。您遇到任何错误吗?
  • 不,没有任何错误,而且代码很多,所以这是个问题,但我用更多信息编辑了帖子
  • 好吧,我想是因为 getSupportFragmentManager().beginTransaction().addToBackStack(null).commit();当您调用此代码时,它将添加一个没有 UI 的 backstack。因此,如果您不覆盖 onBackStack,您可以在 2 次后按后返回到您的第一个片段。什么是“tr”变量?
  • 我没有 onBackStack 调用,它是:final FragmentTransaction tr = getSupportFragmentManager() .beginTransaction();

标签: java android android-fragments android-activity


【解决方案1】:

在主要活动中覆盖 onBackPressed()。

查看当前显示的fragment,如果显示fragment2,则回栈。

示例:

@Override
public void onBackPressed() {
    Fragment fragment2 = getFragmentManager().findFragmentByTag("tag");
    if (fragment2 != null && fragment2.isVisible()) {
        getFragmentManager().popBackStack();
    } else {
        finish();
    }
}

【讨论】:

  • 在主要活动中显示片段之前,我做了 getSupportFragmentManager().beginTransaction().addToBackStack(null).commit();之后做了你的解决方案,当我做 getSupportFragmentManager.findFragmentByTag(null) 时它仍然显示为空,我不知道为什么..
  • 当你添加/替换片段本身时,你必须给出标签名称,beginTransaction().add(fragment2, "tag").commit(),那么你不会得到null。
【解决方案2】:

只需使用以下方式;在你的活动中检查这个

@Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
    Fragment fragment = getSupportFragmentManager().findFragmentByTag("SecondFragment");
            if (fragment instanceof SecondFragment) {
                // show first fragment
            }else{
               // finish();
            }
   }

我用过findFragmentByTag,你也可以用findFragmentById

我同意@Minhtdh 的评论,但它只适用于你替换一个而不是另一个

【讨论】:

  • 在主要活动中显示片段之前,我做了 getSupportFragmentManager().beginTransaction().addToBackStack(null).commit();之后做了你的解决方案,当我做 getSupportFragmentManager.findFragmentByTag(null) 时它仍然显示为空,我不知道为什么..
【解决方案3】:

在 MainActivity 中调用 fragment2.show() 之前,将 Fragmnet 事务添加到 backstack。无需重写 onBackPressed()。默认情况下,android 会为您实现相同的功能。

【讨论】:

  • 在主要活动中显示片段之前,我做了 getSupportFragmentManager().beginTransaction().addToBackStack(null).commit();之后做了你的解决方案,当我做 getSupportFragmentManager.findFragmentByTag(null) 时它仍然显示为空,我不知道为什么..
【解决方案4】:

简单的工作代码。 回到第一个fargment。

yourviewvariable.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getActivity().onBackPressed();
        }
    });

【讨论】:

  • 在主要活动中显示片段之前,我做了 getSupportFragmentManager().beginTransaction().addToBackStack(null).commit();之后做了你的解决方案,当我做 getSupportFragmentManager.findFragmentByTag(null) 时它仍然显示为空,我不知道为什么..
【解决方案5】:

对不起,我错过了输入,我的意思是方法 onBackPressed。
但是对于您的情况,因为您使用 FragmentTransition.show(),它不会将片段添加到 backstack 并且 popBackStack 将不起作用。所以我认为你应该试试这个:
1. 不要调用getSupportFragmentManager().beginTransaction().addToBackStack(null).commit();,因为它添加了不必要的backstack。
2.不要将“tr”变量存储为全局变量,还需要调用commit()来结束事务:
Fragment2.setTag("fragment2"); getSupportFragmentManager().beginTransaction().show(Fragment2).commit();
3.在onBackPressed()中:

    android.support.v4.app.Fragment fragment2 = getSupportFragmentManager().findFragmentByTag("fragment2");
    if (fragment2 != null && fragment2.isVisible()) {
        getSupportFragmentManager().beginTransaction().hide(fragment2).commit();
        return;
    } else {
        super.onBackPressed();
    }

希望对您有所帮助。

【讨论】:

  • 感谢您的回答,但我仍然在 android.support.v4.app.Fragment fragment2 = getSupportFragmentManager().findFragmentByTag("fragment2");
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
相关资源
最近更新 更多