0

내 주요 활동에서 Settings 단추를 누르면 AppCompatActivity with 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(); 
    } 
} 

옵션 조각이 가기 backstack하는 현재의 클래스를 추가로 조각을 대체합니다.

@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, SettingsSubscreenFragmentSettingsFragmentandroid.support.v4.app.Fragment입니다. 그렇지 않은 경우 조각 클래스에서

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

을 시도해보세요.

+0

나는 그 프래그먼트에 대해'PreferenceFragmentCompat'를 사용하고 그 프래그먼트에 대한 컨테이너를 가지고있는 액티비티에 대해서는'AppCompatActivity'를 사용하고 있습니다. 'FragmentTransaction'에 대해서도 지원 라이브러리를 사용하고 있습니다. –