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',我也使用支持庫。 –