为什么addToBackStack()方法不起作用

时间:2015-03-10 08:49:33

标签: android android-fragments

这是我的主要活动。我正确地关注了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主题的解决方案,但它仍然无效。

2 个答案:

答案 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()以获得兼容行为。

相关问题