0

在我的主要活动中,按设置按钮打开一个AppCompatActivity并将FrameLayout作为片段的容器。在OnCreate方法中,我添加了PreferenceScreen容器的片段。由于addBackStack导致两个片段重叠

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

所以,再次打开选项片段将再添备份堆栈和onBackPress,只弹出最上面和离开它的影子重叠在后面堆栈注册的另一个。

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

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

的差不多的情形就像是从here,问题的第三张照片,但我不能让他们的建议工作。

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

回答

0

支票FragmentTransaction,SettingsSubscreenFragmentSettingsFragment正在延伸android.support.v4.app.Fragment。如果不是,请尝试

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

在您的片段类中。

+0

我对这些碎片和AppCompatActivity使用'PreferenceFragmentCompat'来存放这些碎片的容器。对于'FragmentTransaction',我也使用支持库。 –