【问题标题】:Backpress from Activity to Fragment从 Activity 到 Fragment 的后退
【发布时间】:2019-01-08 10:40:56
【问题描述】:

我有一个 BaseActivity,它具有以下流程,FragmentA -> Fragment B ->FinalActivity .现在我想要 backpress 并单击从 FinalActivityFragmentA 的后退按钮。

来自 BaseActivity 我正在调用 FragmentA 之类的,

Fragment selectedFragment = FragmentA .newInstance();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container_fragment, selectedFragment);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.addToBackStack("Some String");
transaction.commit();

FragmentA 我打电话给 FragmentB 喜欢,

Fragment selectedFragment = FragmentB.newInstance();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container_fragment, selectedFragment);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.addToBackStack("Some String");
transaction.commit();

FragmentBFinalActivity我这样叫,

startActivityForResult(FinalActivity.newIntent(getActivity()), 1);

现在从 FinalActivity 后退按钮我想显示 FragmentA

帮助我如何导航。

【问题讨论】:

  • 您可以在开始活动后尝试popBackStack(),例如:if (getFragmentManager() != null) getFragmentManager().popBackStack(); - 这应该删除您的 FragmentB 并离开 FragmentA。所以在用户从FinalActivity返回后,应该呈现FragmentA。
  • backbutton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //onBackpressed(); }});在 FinalActivity 这个函数中调用什么
  • 在执行 startActivityForResult(FinalActivity.newIntent(getActivity()), 1);添加 getActivity().onBackpressed();
  • @Himeshgoswami 谢谢,成功了!
  • @AanchiDev 虽然@Himeshgoswami 回答有效,但这可能不是更好的方法。如果您在startActivityForResult() 之前执行onBackPressed(),那么您可能会在看到FinalActivity 之前看到FragmentA,但如果这并不重要对你来说,Himesh 的建议效果很好。

标签: android android-fragments fragment onbackpressed


【解决方案1】:

正确的方法是,因为你有一个startActivityForResult(),所以为活动设置一个结果,当结束它时,将信息传递给 FragmentB。在您的 onBackPressed() 方法中,您可以添加以下内容:

Intent resultIntent = new Intent();
String dataString = "Some info you might want to return to the fragment...";
resultIntent.setData(Uri.parse(dataString));
setResult(RESULT_OK, resultIntent);
finish();

然后,在您的 FragmentB 中,您必须重写 onActivityResult() 方法:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
     if (requestCode == request_Code) {
        if (resultCode == RESULT_OK) {
            //here you can pop the FragmentB
        }
    }
}

上面的代码会结束FinalActivity ->并将RESULT_OK传递给onActivityResult()方法(会在FragmentB中调用),然后弹出FragmentB,导致显示 FragmentA。

编辑:请注意,您需要 startActivityForResult() 中的 requestCode 与 onActivityResult() 中的相同,否则片段将不知道您要尝试哪个 Activity得到。如果需要,您可以添加静态全局值。

EDIT2: 现在我看到了,在你的代码中你有类似的东西:

transaction.addToBackStack("Some String");

这个“一些字符串”实际上应该是Fragment.getName(),以便后台堆栈可以跟踪其中有哪些片段。

【讨论】:

    【解决方案2】:
    Fragment selectedFragment = FragmentB.newInstance();
    FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.container_fragment, selectedFragment);
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    transaction.commit();
    

    如果你想回到片段A,那么你不需要添加下面给出的行
    当从 Fragment AFragment B 替换片段时,只需从您的代码中删除这个 Given Line

    transaction.addToBackStack("Some String");
    

    并像这样更改启动活动的代码

    startActivity(getActivity(),FinalActivity.class);
    

    【讨论】:

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