【问题标题】:Why addToBackStack() method doesn't work为什么 addToBackStack() 方法不起作用
【发布时间】:2016-01-06 10:24:43
【问题描述】:

这是我的主要活动。我正确关注了 this guide 关于 Fragments 的信息。当我单击“返回”按钮时,我的应用程序将关闭,而不是返回到 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;
    }
}

附:我尝试使用来自this 主题的解决方案,但它仍然不起作用。

【问题讨论】:

  • 您需要覆盖后退按钮的行为才能将片段从后退堆栈中弹出。
  • 你能解释一下我需要覆盖哪种方法吗?我试图覆盖onBackPressed(),但它仍然不起作用。
  • 你是怎么做到的? getFragmentManager().popBackStack(); 应该,嗯,弹出回栈。
  • 哦,谢谢,现在可以用了))

标签: android android-fragments


【解决方案1】:

您是否尝试过像下面这样覆盖背面:

@overide        
public void onBackPressed(){
            FragmentManager fm = getSupportFragmentManager();
                if (fm.getBackStackEntryCount() > 1) {
                    fm.popBackStack();
                } else {
                finish();
               }
        }

【讨论】:

  • 是的,我做到了,但它只有在没有 if 语句的情况下才有效,就像这样:@Override public void onBackPressed() { getFragmentManager().popBackStack(); }
【解决方案2】:

(我知道你已经找到了你想要的答案,但我发现了更多关于这个问题的答案)

尽管 Android 官方网站已记录:

通过调用 addToBackStack(),将替换事务保存到后退堆栈中,以便用户可以反转事务并通过按下后退按钮带回上一个片段。

但事实上,这是在您使用标准的 android 活动,特别是 android.app.Activity 的前提下。因为 android.app.Activity 中的这个方法会在按下 Backbutton 时起作用:

public void onBackPressed() {
    if (mActionBar != null && mActionBar.collapseActionView()) {
        return;
    }

    if (!mFragments.getFragmentManager().popBackStackImmediate()) {
        finishAfterTransition();
    }
}

但是,如果您是从其他人那里扩展您的 xxxxActivity,例如 AppCompatActivity、FragmentActivity、ActionBarActivity,那就另当别论了,因为在 FragmentActivity 中,onBackPressed() 方法被完全覆盖:

public void onBackPressed() {
    if (!mFragments.getSupportFragmentManager().popBackStackImmediate()) {
        supportFinishAfterTransition();
    }
}

请注意,mFragments.getFragmentManager() 被 mFragments.getSupportFragmentManager() 取代,因此在这种情况下,您应该使用 Activity 的 getSupportFragmentManager() 开始您的 FragmentTransaction。因此,您不必在 Activity 中重写 onBackPressed 方法。

顺便说一句,ActionBarActivity 扩展 AppCompatActivity 扩展 FragmentActivity,它们都来自支持库,你知道我的意思,记住在使用支持库时使用 getSupportFragmentManager() 而不是 getFragmentManager() 以获得兼容的行为。

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 2013-01-22
    • 2018-08-06
    • 2012-01-14
    • 2015-11-07
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多