我有一个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;
}
});
}