我在一个活动中有一个片段,我可以使用FragmentManager和FragmentTransaction启动片段,但是当我尝试通过后退按钮导航回Activity时,应用会退出。
这是我的片段创建& Activity类中的事务:
DetailFragment df = new DetailFragment();
try {
df.initFragment(jsonObject);
} catch (Exception e) {
e.printStackTrace();
}
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, df);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
我也覆盖onBackPressed()
@Override
public void onBackPressed() {
super.onBackPressed();
}
通过上述设置,只需按一下后退按钮即可退出主屏幕。
我还尝试修改onBackPressed()来执行:
@Override
public void onBackPressed(){
FragmentManager fm = getFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
} else {
super.onBackPressed();
}
}
在onBackPressed()的第二个版本上,需要2次按下才能返回主屏幕。请记住,我正在尝试返回原始活动。
有什么建议吗?
P.S。我可以根据需要添加我的片段代码
答案 0 :(得分:0)
您的第二个版本onBackPressed()
需要2次反压才能返回主屏幕。所以似乎fm.popBackStack()
被调用了。尝试将其替换为popBackStackImmediate()
。
修改强>
在创建片段时,请尝试使用以下代替.replace
:
fragmentTransaction.add(R.id.fragment_container, df);
如果仍然无效,请尝试:
@Override
public void onBackPressed(){
FragmentManager fm = getFragmentManager();
if (df.isVisible) {
fm.beginTransaction().remove(df).commit();
} else {
super.onBackPressed();
}
}
(虽然这是不太理想的,因为你要对要删除的内容进行硬编码)。
答案 1 :(得分:0)
导航工作正常,但在我的Fragment的onCreateView中,我使用setContentView()到片段视图,将片段视图绘制到主要活动,因此出现后退按钮将退出它被按下了两次,但它实际上是按照它应该返回到主要活动,它只是重新绘制了主要活动所以它无法分辨。
感谢@RogueBaneling的帮助!!
原始代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View fragmentView = inflater.inflate(R.layout.fragment_detail, container, false);
fragmentView.setClickable(true);
getActivity().setContentView(R.layout.fragment_detail);
final TextView movieTitleText = (TextView) getActivity().findViewById(R.id.movie_title_text);
movieTitleText.setText(title);
// editing textView code...
return fragmentView;
}
成:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View fragmentView = inflater.inflate(R.layout.fragment_detail, container, false);
fragmentView.setClickable(true);
final TextView movieTitleText = (TextView) fragmentView.findViewById(R.id.movie_title_text);
movieTitleText.setText(title);
// editing textView code...
return fragmentView;
}