Android 正确的片段 BackStack
Android Correct Fragment BackStack
我正在尝试做一个正确的 BackStack
。我已经尝试实现 this decision。但这对我不起作用。
我在导航抽屉和其他导航中有一个列表。所以,当我 select 不同的片段列表几次时,我希望 one-touch return 到主菜单而不是 returning 到 BackStack
.
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() == 1){
finish();
}
else {
super.onBackPressed();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("theme", mThemeId);
}
private void replaceFragment (Fragment fragment){
String backStateName = fragment.getClass().getName();
String fragmentTag = backStateName;
FragmentManager manager = getSupportFragmentManager();
boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null) {
FragmentTransaction ft = manager.beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right,
R.anim.slide_back_in_left, R.anim.slide_back_out_right);
ft.replace(R.id.frgmCont, fragment);
ft.addToBackStack(backStateName);
ft.commit();
}
}
您可以从定义这两个方法开始:
一种推送带有标志的片段事务的方法,该标志定义是否应将片段添加到 backStack:
private void pushToStack(Fragment fragment, String tag, int transition, boolean addToBackStack){
FragmentManager fm = this.getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(R.id.container, fragment, tag);
if(transition > 0){
transaction.setTransition(transition);
}
if(addToBackStack){
transaction.addToBackStack(tag);
}
transaction.commit();
}
清除backStack的方法:
public void clearStack(){
FragmentManager fm = this.getSupportFragmentManager();
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
那么你只需要处理以下3种情况:
1) 当 activity 是新创建的,你不会将片段添加到后台堆栈:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_home);
this.pushToStack(DefaultHomeFragment.newInstance(), DefaultHomeFragment.class.getSimpleName(), -1, false);
}
2) 当您想要向导航流中添加新片段时,您调用 pushToStack
方法并将 addToBackStack
设置为 true
:
this.pushToStack(NavigationSecondFragment.newInstance(), NavigationSecondFragment.class.getSimpleName(), DEFAULT_TRANSITION, true);
this.pushToStack(NavigationSecondFragment.newInstance(), NavigationThirdFragment.class.getSimpleName(), DEFAULT_TRANSITION, true);
3) 如果要推送的片段是 DefaultHomeFragment
,清空堆栈,然后像这样第一次添加它:
private static final String DEFAULT_CONTENT_NAME = DefaultHomeFragment.class.getSimpleName();
public addFragmentToNavigation(Fragment newFragment){
boolean addToBackStack = true;
if(newFragment..getClass().getSimpleName().equals(DEFAULT_CONTENT_NAME)){
addToBackStack = false;
this.clearStack();
}
this.pushToStack(newFragment, newFragment.getClass().getSimpleName(),
DEFAULT_TRANSITION, addToBackStack);
}
此代码可能会给您一个更好的主意:https://github.com/GrzegorzFeather/open-mbsurfer
我正在尝试做一个正确的 BackStack
。我已经尝试实现 this decision。但这对我不起作用。
我在导航抽屉和其他导航中有一个列表。所以,当我 select 不同的片段列表几次时,我希望 one-touch return 到主菜单而不是 returning 到 BackStack
.
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() == 1){
finish();
}
else {
super.onBackPressed();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("theme", mThemeId);
}
private void replaceFragment (Fragment fragment){
String backStateName = fragment.getClass().getName();
String fragmentTag = backStateName;
FragmentManager manager = getSupportFragmentManager();
boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null) {
FragmentTransaction ft = manager.beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right,
R.anim.slide_back_in_left, R.anim.slide_back_out_right);
ft.replace(R.id.frgmCont, fragment);
ft.addToBackStack(backStateName);
ft.commit();
}
}
您可以从定义这两个方法开始:
一种推送带有标志的片段事务的方法,该标志定义是否应将片段添加到 backStack:
private void pushToStack(Fragment fragment, String tag, int transition, boolean addToBackStack){
FragmentManager fm = this.getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(R.id.container, fragment, tag);
if(transition > 0){
transaction.setTransition(transition);
}
if(addToBackStack){
transaction.addToBackStack(tag);
}
transaction.commit();
}
清除backStack的方法:
public void clearStack(){
FragmentManager fm = this.getSupportFragmentManager();
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
那么你只需要处理以下3种情况:
1) 当 activity 是新创建的,你不会将片段添加到后台堆栈:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_home);
this.pushToStack(DefaultHomeFragment.newInstance(), DefaultHomeFragment.class.getSimpleName(), -1, false);
}
2) 当您想要向导航流中添加新片段时,您调用 pushToStack
方法并将 addToBackStack
设置为 true
:
this.pushToStack(NavigationSecondFragment.newInstance(), NavigationSecondFragment.class.getSimpleName(), DEFAULT_TRANSITION, true);
this.pushToStack(NavigationSecondFragment.newInstance(), NavigationThirdFragment.class.getSimpleName(), DEFAULT_TRANSITION, true);
3) 如果要推送的片段是 DefaultHomeFragment
,清空堆栈,然后像这样第一次添加它:
private static final String DEFAULT_CONTENT_NAME = DefaultHomeFragment.class.getSimpleName();
public addFragmentToNavigation(Fragment newFragment){
boolean addToBackStack = true;
if(newFragment..getClass().getSimpleName().equals(DEFAULT_CONTENT_NAME)){
addToBackStack = false;
this.clearStack();
}
this.pushToStack(newFragment, newFragment.getClass().getSimpleName(),
DEFAULT_TRANSITION, addToBackStack);
}
此代码可能会给您一个更好的主意:https://github.com/GrzegorzFeather/open-mbsurfer