这是我的主要活动。我正确地关注了this guide有关碎片的信息。当我点击"返回"按钮,我的应用程序关闭,而不是返回到MainScreenFragment。为什么会发生这种情况以及为什么addToBackStack()
不起作用?
public class MainScreenActivity extends ActionBarActivity implements MainScreenFragment.OnFrameChoiced {
private MainScreenFragment mainScreenFragment;
private AddWordsFragment addWordsFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_screen);
mainScreenFragment = new MainScreenFragment();
addWordsFragment = new AddWordsFragment();
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.container, mainScreenFragment).addToBackStack(null).commit();
}
@Override
public void choiceFrame(int id) {
switch (id) {
case R.id.add_new_words_frame:
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container, addWordsFragment).addToBackStack(null).commit();
fm.executePendingTransactions();
break;
}
}
P.S。我尝试使用this主题的解决方案,但它仍然无效。
答案 0 :(得分:1)
你是否尝试过覆盖背面如下:
@overide
public void onBackPressed(){
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 1) {
fm.popBackStack();
} else {
finish();
}
}
答案 1 :(得分:0)
(我知道你已经找到了你想要的答案,但我已经找到了一些针对这个问题的答案)
虽然Android官方网站已记录:
通过调用addToBackStack(),替换事务被保存到后栈,因此用户可以通过按Backbutton来反转事务并恢复前一个片段。
但事实上,这是在使用标准的android活动,特别是android.app.Activity的前提条件。因为当按下Backbutton时,android.app.Activity中的这个方法会起作用:
func viewDidLoad()
{
tableView.registerClass(CustomCell.self, forCellReuseIdentifier: "Cell")
// other setup...
}
但是,如果你从其他人扩展xxxxActivity,例如AppCompatActivity,FragmentActivity,ActionBarActivity,那将是另一个故事,因为在FragmentActivity中,onBackPressed()方法完全被覆盖:
public void onBackPressed() {
if (mActionBar != null && mActionBar.collapseActionView()) {
return;
}
if (!mFragments.getFragmentManager().popBackStackImmediate()) {
finishAfterTransition();
}
}
请注意,mFragments.getFragmentManager()被mFragments.getSupportFragmentManager()替换,因此在这种情况下,您应该使用Activity的getSupportFragmentManager()开始FragmentTransaction。因此,您不必在Activity中覆盖onBackPressed方法。
BTW,ActionBarActivity扩展AppCompatActivity扩展了FragmentActivity,它们都来自支持库,你知道我的意思,记得在使用支持库时使用getSupportFragmentManager()代替getFragmentManager()以获得兼容行为。