由于附加框架而引起的两个片段重叠



从我的主要活动中,按"设置"按钮可以用framelayout作为片段的容器打开一个应用程序。在OnCreate方法中,我添加了一个偏好屏容器的片段。

@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;
}

按下UP按钮时,我只是将选项片段替换为第一个片段,即不会弹出后堆栈的设置。

@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);
}

因此,再次打开选项片段将在后堆栈和onbackpress中添加另一个片段,它只会弹出最上方,并使其阴影重叠另一个注册在后堆中。

@Override
public void onBackPressed() {
    int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
    if (backStackCount >= 1) {
        getSupportActionBar().setTitle("Settings");
        getSupportFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}

几乎相同的情况从这里,第三张问题的图片,但我无法与他们的建议一起使用。

我在做什么错,我该怎么做才能做这项工作?非常感谢。

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

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

在您的片段类中。

最新更新