【问题标题】:Two fragments overlaps due to addBackStack由于 addBackStack 两个片段重叠
【发布时间】:2017-09-03 11:30:30
【问题描述】:

在我的主要活动中,按下设置按钮会打开一个 AppCompatActivity,其中 FrameLayout 作为片段的容器。在 OnCreate 方法中,我添加了 PreferenceScreen 容器片段。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.settings);

    Toolbar toolbar = (Toolbar) findViewById(R.id.custom_toolbar);
    setSupportActionBar(toolbar);

    ActionBar ab = getSupportActionBar();
    if (ab != null) {
        ab.setDisplayHomeAsUpEnabled(true);
        ab.setTitle("Settings");
    }


    FragmentManager fragmentManager = getSupportFragmentManager();
    Fragment fragment = null;
    if (savedInstanceState == null) {
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        fragment = SettingsFragment.newInstance(null);
        fragmentTransaction.add(R.id.fragment_container, fragment);

        fragmentTransaction.commit();
    }
}

再次按下另一个名为“选项”的按钮,打开用选项片段替换片段,将当前类添加到后台堆栈。

@Override
public boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, PreferenceScreen pref) {

    FragmentManager manager = getSupportFragmentManager();

    SettingsSubscreenFragment fragment = null;
    Bundle args = new Bundle();

    switch (pref.getKey()) {
        case "pref_key_rejection_options":
            getSupportActionBar().setTitle("Rejection Options");
            fragment = SettingsSubscreenFragment.newInstance("Options");

            break;
    }

    args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, pref.getKey());

    if (fragment != null) {
        fragment.setArguments(args);
    }

    FragmentTransaction ft = manager.beginTransaction();
    ft.replace(R.id.fragment_container, fragment, pref.getKey());
    ft.addToBackStack(null);
    ft.commit();

    return true;
}

当我按下向上按钮时,我只是将选项片段替换为第一个片段设置,它不会弹出返回堆栈。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            getSupportActionBar().setTitle("Settings");

            FragmentManager fragmentManager;
            FragmentTransaction ft;
            Fragment fragment = null;

            if (getSupportFragmentManager().findFragmentByTag("pref_key_options") != null) {
                fragmentManager = getSupportFragmentManager();
                ft = fragmentManager.beginTransaction();                 

                fragment = SettingsFragment.newInstance(null);


                ft.replace(R.id.fragment_container, fragment);
                ft.commit();
                fragmentManager.getFragments().clear();


                return true;
            } else {
                return super.onOptionsItemSelected(item);
            }

    }
    return super.onOptionsItemSelected(item);
}

因此,再次打开 Options 片段会在返回堆栈和 onBackPress 中添加另一个片段,它只会弹出最顶部并使其阴影与在返回堆栈中注册的另一个片段重叠。

@Override
public void onBackPressed() {
    int backStackCount = getSupportFragmentManager().getBackStackEntryCount();

    if (backStackCount >= 1) {
        getSupportActionBar().setTitle("Settings");
        getSupportFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}

几乎相同的情况就像来自here,问题的第三张图片,但我无法按照他们的建议进行操作。

我做错了什么,我可以做些什么来完成这项工作?非常感谢。

【问题讨论】:

    标签: android android-fragments android-preferences onbackpressed fragment-backstack


    【解决方案1】:

    检查 FragmentTransactionSettingsSubscreenFragmentSettingsFragment 正在扩展 android.support.v4.app.Fragment 。如果没有,请尝试

    class YourFragments extends android.support.v4.app.Fragment 
    

    在您的片段类中。

    【讨论】:

    • 我将PreferenceFragmentCompat 用于这些片段,AppCompatActivity 用于为这些片段保存容器的活动。对于FragmentTransaction,我也在使用支持库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2021-02-04
    • 2020-11-23
    • 2014-03-05
    • 1970-01-01
    相关资源
    最近更新 更多