问题
在我描述我当前的设置之前,我将描述我的问题。我需要在单独的标签内的片段之间进行分层导航。假设我在选项卡中向下钻取,我然后切换选项卡,然后返回到第一个原始选项卡,我需要它在钻取的下层,然后能够返回到顶层标签
现在进入我的设置。
我有一个名为MainActivity
的活动的应用程序。此活动控制我的选项卡式操作栏。我选择了一个标签时,我已经按照许多不同的教程来处理片段的切换,下面的代码可以引起您对onTabSelected
和onTabUnselected
方法的注意。
MainActivity - 标签监听器
public static class MyTabListener<T extends Fragment> implements ActionBar.TabListener {
private final Activity mActivity;
private final String mTag;
private final Class<T> mClass;
private final Bundle mArgs;
private Fragment mFragment;
public MyTabListener(Activity activity, String tag, Class<T> clz) {
this(activity, tag, clz, null);
}
public MyTabListener(Activity activity, String tag, Class<T> clz, Bundle args) {
mActivity = activity;
mTag = tag;
mClass = clz;
mArgs = args;
// Check to see if we already have a fragment for this tab, probably
// from a previously saved state. If so, deactivate it, because our
// initial state is that a tab isn't shown.
mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
if (mFragment != null && !mFragment.isDetached()) {
FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction();
ft.detach(mFragment);
ft.commit();
}
}
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Log.e("FRAGMENT","Selected Fragment With Tag " + mTag);
if (mFragment == null) {
mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
ft.add(android.R.id.content, mFragment, mTag);
} else {
ft.attach(mFragment);
}
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if (mFragment != null) {
ft.detach(mFragment);
}
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
Toast.makeText(mActivity, "Reselected!", Toast.LENGTH_SHORT).show();
}
}
当我在Tab1
查看Fragment1', when a button is pressed I then show another
片段called
Fragment2`时,我需要能够返回。下面的代码可以工作,如果我只是停留在该选项卡上,但是当离开选项卡并返回到它时,一切都会混乱。
MainActivity - 显示第二个片段
Fragment tdFrag = Fragment.instantiate(this, SecondFragment.class.getName());
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(android.R.id.content, tdFrag, "secondfrag");
ft.addToBackStack(null);
ft.commit();
我的想法
我认为这必须是我按下新标签时分离片段并处理切换的方式。也许我需要为每个选项卡实现一些存储每个单独的backstack并从中加载片段而不是系统后栈的方法?
任何帮助都会很棒。我试图尽可能彻底和简单地解释它。
提前致谢。
答案 0 :(得分:1)
好的,经过一些实验,我决定使用枚举类型实现自定义backstack。
我有两种类型的枚举类型:ViewType
和CurrentTab
类型。 CurrentTab
类型告诉我当前正在查看哪个标签,ViewType
告诉我这些标签中正在查看哪个视图。我有一个ViewType
的实例,我必须存储在每个标签中我在这里的层次结构。
要实现backstack,我会覆盖按下后退按钮时调用的方法。
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
return true;
}
return super.onKeyDone(keyCode,event);
}
因此,在检查后退按钮的地方,我将代码检查当前选项卡和单独的视图类型。这样我知道我在哪里,如果我退后,我知道我需要去哪里。
我希望这有助于任何问题发表评论。