片段未在后退按钮上打开上一个片段

Posted

技术标签:

【中文标题】片段未在后退按钮上打开上一个片段【英文标题】:Fragment not Opening Previous Fragment on Back Button 【发布时间】:2021-01-17 07:24:15 【问题描述】:

我一直在努力实现一个超级简单的应用程序布局,我的MainActivity 在其onCreate 方法中打开Fragment#1,然后Fragment#1 在单击项目时打开Fragment#2

目前,当我从我的MainActivity 打开Fragment#1 时,我会将Fragment#1 添加到BackStack。打开Fragment#2 后,当我点击返回按钮时,第一次单击什么也不做,然后第二次单击将我一路返回到我的登录页面,跳过Fragment #1MainActivity

我怎样才能做到这一点,当我点击Fragment#2 上的返回按钮时,它会打开Fragment#1 备份?

(MainActivity 打开Fragment#1)

public class MainActivity extends AppCompatActivity 

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        SearchListFragment fragment = new SearchListFragment();
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.main_fragment_container, fragment);
        transaction.addToBackStack(TAG);
        transaction.commit();

    

(Fragment#1 打开Fragment#2)

public class SearchListFragment extends Fragment 

    public void viewResults(SearchModel search) 
        Bundle args = new Bundle();
        args.putString("ID", search.getId());
        ResultsFragment fragment = new ResultsFragment();
        fragment.setArguments(args);
        FragmentTransaction transaction = getParentFragmentManager().beginTransaction();
        transaction.replace(R.id.main_fragment_container, fragment);
        transaction.commit();
    

编辑

我应该提到我已经尝试自己处理后按事件。我尝试将此添加到我的MainActivity,但它并没有改变行为:

@Override
    public void onBackPressed() 
        if (getSupportFragmentManager().getBackStackEntryCount() == 0) 
            this.finish();
         else 
            getSupportFragmentManager().popBackStack();
        
    

【问题讨论】:

【参考方案1】:

onCreate with

科特林

   val backpress = requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, true) 
                        // Handle the back button event


Java

    OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) 
        @Override
        public void handleOnBackPressed() 
            // Handle the back button event
        
    );
    requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);

您可以在相关部分提供您的后台操作。

【讨论】:

你建议我把处理程序放在什么地方? FragmentManager.popBackStack() 之类的东西?【参考方案2】:
getSupportFragmentManager().beginTransaction().replace(R.id.frag_frame, fragment).addToBackStack("text").commit();

【讨论】:

你能澄清一下吗?这是我在创建 Fragment#1 时在 onCreate 中实现的几乎完全相同的代码 在 Stack Overflow 上不鼓励仅使用代码的答案,因为它们没有解释它如何解决问题。请编辑您的答案以解释此代码的作用以及它如何回答问题,以便它对 OP 以及其他有类似问题的用户有用。

以上是关于片段未在后退按钮上打开上一个片段的主要内容,如果未能解决你的问题,请参考以下文章

带有 Webview 的片段利用硬件后退按钮转到上一个网页

如何在带有更多片段的操作栏上添加后退按钮

后退按钮关闭应用程序而不是转到上一个片段 android 导航组件

ActionBar的后退主页按钮无法使用片段

在 Android 片段中使用 onBackPressed()

如何防止在android片段中按下后退按钮时调用onCreateView