主要活动使用此事务打开main_fragment:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.fragment_main_container, new MainFragment())
.commit();
}
然后我用另一个片段替换那个片段:
// method to handle Conversions button click
public void addConversionsFragment (View v) {
// replace the main fragment with the conversion fragment
UnitConversionFragment newFragment = new UnitConversionFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
transaction.replace(R.id.fragment_main_container, newFragment);
// and add the transaction to the back stack so the user can navigate back
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
}
最初,我使用support.v4.app.fragment
,一切都按预期工作(第二个片段中的后退按钮将弹出那个并返回MainFragment
。但后来我决定实现{ {1}}其他地方,支持库似乎并不喜欢。所以我将整个项目转换为常规PreferenceFragment
,删除所有支持导入,替换为常规导入,然后编辑所有app.fragment
与getSupportFragmentManager()
等等。
好消息是getFragmentManager()
运行良好,但是当我点击片段中的后退按钮时,它会关闭托管活动而不是撤消交易。
我做了很多搜索,似乎我正在正确地实现代码,但它只是没有像我期待的那样响应。是否有更多参与转换支持库?或者我错过了其他明显的东西?我看到很多答案覆盖了PreferenceFragment
,但我真的不想这样做。
v4支持库和常规库之间是否存在一些根本区别,需要我以不同方式处理片段事务?
答案 0 :(得分:0)
Preference Fragment有一些额外的逻辑来处理层次结构首选项。您可以将其配置为启动子片段屏幕,然后向后导航,如演示here。
<PreferenceScreen android:title="Sub Preferences"
android:fragment="com.example.SettingsDemo.SubPrefFragment"/>
对于普通片段,片段后栈在到达Activity后栈之前首先弹出。这是记录在案的内容。
android.app.Activity
和android.support.v4.app.FragmentActivity
中的代码完全相同:
/**
* Take care of popping the fragment back stack or finishing the activity
* as appropriate.
*/
public void onBackPressed() {
if (!mFragments.popBackStackImmediate()) {
finish();
}
}
没有按预期发生的唯一原因是其他东西消耗了&#34;背压&#34;,这可能发生在有3个级别的组件时:
Activity
位于ActivityGroup
内。 Fragment
位于另一个Fragment
内。 (为此,v4片段存在一些错误。)答案 1 :(得分:-1)
因为在右侧,后退按钮会返回活动,而片段只是当前活动的叠加层。所以按下后退按钮即可。