我有一个Android应用程序,其中包含一个活动和两个片段。第一个片段(MainFragment)显示“项目”列表,第二个片段(DetailsFragment)显示项目的详细信息(非常基本)。

在正常流程上,活动开始并显示第一个片段,单击一个项目则显示第二个片段。

但是第二个片段可以通过单击通知直接显示(通过在活动中添加额外的参数)。

String id = getIntent().getStringExtra("id");
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

if (id != null) {
    fragment = new DetailsFragment();
    Bundle args = new Bundle();
    args.putString("id", id);
    fragment.setArguments(args);
} else {
    fragment = new MainFragment();
}

ft.replace(R.id.main, fragment);
ft.commit();


在第二种情况下,问题是:从MainFragment单击时如何打开DetailsFragment?实际上,应用程序完成了,因为仅创建了第二个片段。

最佳答案

First way:非常简单。您只需要使用addToBackStack(null)。它将保存您想要的片段,并且当您使用backpress时,它将打开该片段。

做这样的事情:

if (id != null) {
    fragment = new DetailsFragment();
    Bundle args = new Bundle();
    args.putString("id", id);
    fragment.setArguments(args);
    ft.replace(R.id.main, fragment);
    ft.commit();
} else {
    fragment = new MainFragment();
    ft.replace(R.id.main, fragment).addToBackStack(null);
    ft.commit();
}


您的DetailsFragment的onResume()方法中的Second way:编写此代码。

   @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 (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
                        fragment = new MainFragment();
                        fragmentManager = getFragmentManager();
                        fragmentTransaction = fragmentManager.beginTransaction();
                        fragmentTransaction.replace(R.id.main, fragment);
                        fragmentTransaction.commit();
                        return true;
                    }
                    return false;
                }
            });
}

09-30 23:04