내 주요 활동에서 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, 질문의 세 번째 그림에서처럼,하지만 난 그들의 제안을 작동 할 수 없습니다.
내가 뭘 잘못하고 내가이 일을하기 위해 무엇을 할 수 있습니까? 고마워.
나는 그 프래그먼트에 대해'PreferenceFragmentCompat'를 사용하고 그 프래그먼트에 대한 컨테이너를 가지고있는 액티비티에 대해서는'AppCompatActivity'를 사용하고 있습니다. 'FragmentTransaction'에 대해서도 지원 라이브러리를 사용하고 있습니다. –