BackStackNavigation 不适用于 NavigationDrawer
BackStackNavigation not working with NavigationDrawer
根据我在这里找到的一些帖子,我已经正确地实现了 BackStackNavigation,但是每当我在任何片段上按下后退按钮时,应用程序都会弹出当前片段,显示前一个片段的闪光,然后退出。我无法解决这个问题。任何帮助都感激不尽。是我做错了还是有其他问题?
我的应用程序的结构是,
MainActivity -> NavigationDrawerFragment -> 1. RecyclerViewFragment -> TextViewFragment
2. SlidingTabStrips.ViewPager (Fragment)
3. Some Code (No fragments)
这是 MainActivity
中覆盖的 onBackPressed
:
@Override
public void onBackPressed() {
super.onBackPressed();
getFragmentManager().popBackStack(backStack[TOP],
FragmentManager.POP_BACK_STACK_INCLUSIVE);
backStack[TOP] = null;
TOP--;
Log.e("BACK_STACK_COUNT_ON_POP",Integer
.toString(getFragmentManager().getBackStackEntryCount()));
Log.e("TOP",Integer.toString(TOP));
}
现在我用这种方式替换 NavigationDrawer
中的片段:
switch(position) {
case 0: //Events
fragmentManager.beginTransaction().replace(R.id.container,
EventsRecyclerViewFragment.newInstance(position + 1))
.addToBackStack(EVENT_RV_FRAGMENT).commit();
++TOP;
backStack[TOP] = EVENT_RV_FRAGMENT;
break;
case 1: //User
fragmentManager.beginTransaction().replace(R.id.container,
UserFragment.newInstance(position + 1))
.addToBackStack(USER_FRAGMENT).commit();
++TOP;
backStack[TOP] = USER_FRAGMENT;
break;
case 2: //Logout
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
if(prefs.getBoolean(KEY_LOGIN, false)) {
prefs.edit().remove(KEY_LOGIN).apply();
prefs.edit().remove(KEY_USERNAME).apply();
prefs.edit().remove(KEY_PASSWORD).apply();
Intent intent = getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(intent);
Customs.mToast(getBaseContext(), "Logged-out");
}
break;
}
这就是我在 RecyclerViewFragment 中调用 TextViewFragment 的方式:
getFragmentManager().beginTransaction()
.replace(R.id.container, eventFragment)
.addToBackStack(EVENT_FRAGMENT)
.commit();
++TOP;
backStack[TOP] = EVENT_FRAGMENT;
已加载 NavigationDrawer onCreate
:
当我从上面点击事件时打开 RecyclerViewFragment:
当我点击上面显示的其中一张卡片时打开 TextViewFragment:
一个非常简短的工作示例...我没有检查它是否是一个 API 问题,它在 21 级上是这样工作的。
使用 addToBackstack = false 添加第一个片段,使用 addToBackstack = true 添加另一个片段。
Activity(xml 仅包含 ID 为 rlRoot 的相对布局)
public class FragActivity extends ActionBarActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.frag_activity);
addFragment(new Frag1(), false, Frag1.TAG);
addFragment(new Frag2(), true, Frag2.TAG);
}
private void addFragment(Fragment fragment, boolean addToBackStack, String tag) {
FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.replace(R.id.rlRoot, fragment, tag);
if(addToBackStack) trans.addToBackStack(tag);
trans.commit();
}
}
碎片
public class Frag1 extends Fragment {
public static final String TAG = Frag1.class.getSimpleName();
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
TextView tv = new TextView(getActivity());
tv.setText(String.valueOf(1));
return tv;
}
}
public class Frag2 extends Fragment {
public static final String TAG = Frag1.class.getSimpleName();
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
TextView tv = new TextView(getActivity());
tv.setText(String.valueOf(2));
return tv;
}
}
好的,我找到了解决方案。
onBackPressed()
在 ActionBarActivity.class
中的原始实现是..
public void onBackPressed() { /* compiled code */ }
所以当我们想从堆栈中移除顶部框架时,我们必须在 overridden onBackPressed()
中调用 getFragmentManager().popBackStack()
。
当堆栈为空调用 super.onBackPressed()
时,它没有任何内容,因此应用程序将简单地退出。
重写的 onBackPressed() 应该是这样的:
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() > 0) {
getFragmentManager().popBackStack();
}
else {
super.onBackPressed();
}
}
根据我在这里找到的一些帖子,我已经正确地实现了 BackStackNavigation,但是每当我在任何片段上按下后退按钮时,应用程序都会弹出当前片段,显示前一个片段的闪光,然后退出。我无法解决这个问题。任何帮助都感激不尽。是我做错了还是有其他问题?
我的应用程序的结构是,
MainActivity -> NavigationDrawerFragment -> 1. RecyclerViewFragment -> TextViewFragment
2. SlidingTabStrips.ViewPager (Fragment)
3. Some Code (No fragments)
这是 MainActivity
中覆盖的 onBackPressed
:
@Override
public void onBackPressed() {
super.onBackPressed();
getFragmentManager().popBackStack(backStack[TOP],
FragmentManager.POP_BACK_STACK_INCLUSIVE);
backStack[TOP] = null;
TOP--;
Log.e("BACK_STACK_COUNT_ON_POP",Integer
.toString(getFragmentManager().getBackStackEntryCount()));
Log.e("TOP",Integer.toString(TOP));
}
现在我用这种方式替换 NavigationDrawer
中的片段:
switch(position) {
case 0: //Events
fragmentManager.beginTransaction().replace(R.id.container,
EventsRecyclerViewFragment.newInstance(position + 1))
.addToBackStack(EVENT_RV_FRAGMENT).commit();
++TOP;
backStack[TOP] = EVENT_RV_FRAGMENT;
break;
case 1: //User
fragmentManager.beginTransaction().replace(R.id.container,
UserFragment.newInstance(position + 1))
.addToBackStack(USER_FRAGMENT).commit();
++TOP;
backStack[TOP] = USER_FRAGMENT;
break;
case 2: //Logout
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
if(prefs.getBoolean(KEY_LOGIN, false)) {
prefs.edit().remove(KEY_LOGIN).apply();
prefs.edit().remove(KEY_USERNAME).apply();
prefs.edit().remove(KEY_PASSWORD).apply();
Intent intent = getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(intent);
Customs.mToast(getBaseContext(), "Logged-out");
}
break;
}
这就是我在 RecyclerViewFragment 中调用 TextViewFragment 的方式:
getFragmentManager().beginTransaction()
.replace(R.id.container, eventFragment)
.addToBackStack(EVENT_FRAGMENT)
.commit();
++TOP;
backStack[TOP] = EVENT_FRAGMENT;
已加载 NavigationDrawer onCreate
:
当我从上面点击事件时打开 RecyclerViewFragment:
当我点击上面显示的其中一张卡片时打开 TextViewFragment:
一个非常简短的工作示例...我没有检查它是否是一个 API 问题,它在 21 级上是这样工作的。
使用 addToBackstack = false 添加第一个片段,使用 addToBackstack = true 添加另一个片段。
Activity(xml 仅包含 ID 为 rlRoot 的相对布局)
public class FragActivity extends ActionBarActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.frag_activity);
addFragment(new Frag1(), false, Frag1.TAG);
addFragment(new Frag2(), true, Frag2.TAG);
}
private void addFragment(Fragment fragment, boolean addToBackStack, String tag) {
FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.replace(R.id.rlRoot, fragment, tag);
if(addToBackStack) trans.addToBackStack(tag);
trans.commit();
}
}
碎片
public class Frag1 extends Fragment {
public static final String TAG = Frag1.class.getSimpleName();
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
TextView tv = new TextView(getActivity());
tv.setText(String.valueOf(1));
return tv;
}
}
public class Frag2 extends Fragment {
public static final String TAG = Frag1.class.getSimpleName();
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
TextView tv = new TextView(getActivity());
tv.setText(String.valueOf(2));
return tv;
}
}
好的,我找到了解决方案。
onBackPressed()
在 ActionBarActivity.class
中的原始实现是..
public void onBackPressed() { /* compiled code */ }
所以当我们想从堆栈中移除顶部框架时,我们必须在 overridden onBackPressed()
中调用 getFragmentManager().popBackStack()
。
当堆栈为空调用 super.onBackPressed()
时,它没有任何内容,因此应用程序将简单地退出。
重写的 onBackPressed() 应该是这样的:
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() > 0) {
getFragmentManager().popBackStack();
}
else {
super.onBackPressed();
}
}