- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
由于 TabActivity 已被弃用,我尝试用开发者 android 网站中已经提到的 Fragments 替换它。但是正如你们已经知道的那样,用 fragment 替换选项卡存在问题,因为只有一个 Activity ,即 fragment Activity ,每个 fragment 都没有返回堆栈,正如您在其他 SO 问题中看到的那样的开发人员表示,您需要将自己的自定义返回堆栈作为一种解决方案进行管理。
我已经创建并实现了我自己的自定义返回堆栈,如下所示,它工作得非常完美,我可以跟踪每个选项卡中的每个 fragment 。
标签1
Fragment1 > Fragment2 > Fragment3
选项卡2
Fragment5 > Fragment6
根据上面的导航,如果我从 Fragment1 导航到 Fragment 3,然后如果我将选项卡更改为 Tab2 并返回 Tab1,我仍然可以看到 Fragment3,我什至可以使用我的自定义导航回 Fragment1返回堆栈。
但问题是,当我返回 Tab1 并看到 Fragment3 时,Fragment3 被重新创建,我看不到在将选项卡更改为 Tab2 之前留下的更改。
这是我的自定义返回堆栈;
public static HashMap<String, Stack<Fragment>> customBackStack;
public static Stack<Fragment> simpleStack;
public static Stack<Fragment> contactStack;
public static Stack<Fragment> customStack;
public static Stack<Fragment> throttleStack;
public static Stack<Fragment> homeStack;
customBackStack = new HashMap<String, Stack<Fragment>>();
homeStack = new Stack<Fragment>();
simpleStack = new Stack<Fragment>();
contactStack = new Stack<Fragment>();
customStack = new Stack<Fragment>();
throttleStack = new Stack<Fragment>();
customBackStack.put("home", homeStack);
customBackStack.put("simple", simpleStack);
customBackStack.put("contacts", contactStack);
customBackStack.put("custom", customStack);
customBackStack.put("throttle", throttleStack);
这里是 onTabChanged 方法;
public void onTabChanged(String tabId) {
TabInfo newTab = mTabs.get(tabId);
if (mLastTab != newTab) {
FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
if (mLastTab != null) {
if (mLastTab.fragment != null) {
ft.detach(mLastTab.fragment);
}
}
if (newTab != null) {
if (newTab.fragment == null) {
if (!customBackStack.get(tabId).isEmpty()) {
Fragment fragment = customBackStack.get(tabId).pop();
customBackStack.get(tabId).push(fragment);
ft.replace(mContainerId, fragment);
}
} else {
if (!customBackStack.get(tabId).isEmpty()) {
Fragment fragment = customBackStack.get(tabId).pop();
customBackStack.get(tabId).push(fragment);
ft.replace(mContainerId, fragment);
}
}
}
mLastTab = newTab;
ft.commit();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
}
这里是 onBackPressed;
public void onBackPressed() {
Stack<Fragment> stack = customBackStack.get(mTabHost.getCurrentTabTag());
if (stack.isEmpty()) {
super.onBackPressed();
} else {
Fragment fragment = stack.pop();
if (fragment.isVisible()) {
if (stack.isEmpty()) {
super.onBackPressed();
} else {
Fragment frg = stack.pop();
customBackStack.get(mTabHost.getCurrentTabTag()).push(frg);
transaction = getSupportFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right,
R.anim.slide_in_right, R.anim.slide_out_left);
transaction.replace(R.id.realtabcontent, frg).commit();
}
} else {
getSupportFragmentManager().beginTransaction().replace(R.id.realtabcontent, fragment).commit();
}
}
}
因此,自定义返回堆栈工作正常,除了更改选项卡之前的最后一个 fragment 在返回选项卡后重新创建,它不像选项卡 Activity 中那样恢复。
知道如何解决吗?
编辑
您可以在此处找到我的示例应用程序作为解决此问题的方法。
最佳答案
我将 googles 示例 tablistener 修改为以下内容:
public static class TabListener<T extends SherlockFragment> implements ActionBar.TabListener {
private final SherlockFragmentActivity mActivity;
private final String mTag;
private final Class<T> mClass;
private final Bundle mArgs;
public SherlockFragment mFragment;
private final Stack<SherlockFragment> mStack;
public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) {
this(activity, tag, clz, null, null);
}
public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz, Bundle args, Stack<SherlockFragment> stack) {
mActivity = activity;
mTag = tag;
mClass = clz;
mArgs = args;
mStack = stack;
// 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 = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag);
if (mFragment != null && !mFragment.isDetached()) {
FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
ft.detach(mFragment);
ft.commit();
}
}
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// we need to reattach ALL fragments thats in the custom stack, if we don't we'll have problems with setCustomAnimation for fragments.
if (mFragment == null) {
mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName(), mArgs);
ft.replace(android.R.id.content, mFragment, mTag);
} else {
ft.attach(mFragment);
}
if(mStack != null) {
for(SherlockFragment fragment: mStack) {
ft.attach(fragment);
}
}
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if (mFragment != null) {
ft.detach(mFragment);
}
if(mStack != null) {
for(SherlockFragment fragment: mStack) {
if(fragment!= null && !fragment.isDetached()) {
ft.detach(fragment);
}
}
}
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
我覆盖的 onKeyDown 方法如下:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
int index = getSupportActionBar().getSelectedNavigationIndex();
Stack<SherlockFragment> stack = null;
SherlockFragment fragment = null;
String rootTag = null;
switch(index) {
case 0:
stack = mWatersTabListener.mStack;
fragment = mWatersTabListener.mFragment;
rootTag = mWatersTabListener.mTag;
break;
case 1:
stack = mHarborTabListener.mStack;
fragment = mHarborTabListener.mFragment;
rootTag = mHarborTabListener.mTag;
break;
}
if(stack.isEmpty()) {
return super.onKeyDown(keyCode, event);
} else {
SherlockFragment topFragment = stack.pop();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.setCustomAnimations(R.anim.fragment_slide_right_enter,
R.anim.fragment_slide_right_exit);
if(topFragment != null && !topFragment.isDetached()) {
ft.detach(topFragment);
}
if(stack.isEmpty()) {
ft.replace(android.R.id.content, fragment, rootTag);
ft.commit();
return true;
} else {
SherlockFragment nextFragment = stack.peek();
ft.replace(android.R.id.content, nextFragment);
ft.commit();
return true;
}
}
}
return super.onKeyDown(keyCode, event);
}
需要注意的重要事项是,您必须在选中时附加自定义堆栈中的所有 fragment ,并且在未选中时也必须分离所有 fragment 。如果在理解代码 fragment 方面有问题,请提问。
关于android - Android 中 TabHost 中每个 fragment 的自定义返回堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12854105/
我正在做一个学校项目,在 android studio 上制作一个信息应用程序。我需要创建一个包含 4 个选项卡的 tabHost。在选项卡 1 中,我必须能够左右滑动才能显示 5 个不同的 Acti
我有一个 tabhost,它位于我的主要 Activity (抽屉导航)中。 在每个选项卡中,我都有 ViewPager。 ViewPager 由不同的 Fragment 组成。 在这些 fragme
我注意到使用 tabhost 有很多问题,但没有一个真正适合我的问题。我正在尝试使用 action bar 创建 View 在顶部,然后是栏下方的一排选项卡。这是我的 Activity 布局。
我是 Android 新手。 我正在实现与选项卡主机相关的编码。 我在选项卡主机中创建了三个选项卡,分别命名为 tab1、tab2、tab3。 当我启动我的应用程序时,tab1 会自动触发。 我的意图
我有一个正在切换 Activity 的 TabHost Activity ,所以我的主要内容如下所示: 我的一个子 Activity XML
我创建了一个应用程序,其中包含四个加载了特定 WebView 的选项卡。我计划在选项卡下方添加广告。在我的代码中,我将内容 View 设置为创建为 TabHost 的 ViewGroup。如果我将此
下面是我想要的图片。 现在。当我单击某个项目(参见图像中的 2)时,会显示不正确的版本(参见图像中的 3)。 如何将第二个 tabhost(参见图中的 3)加载到第一个 tabhost 的框架布局中?
我有一个问题: Java 代码 public class VisualizzaListaActivity extends TabActivity { /** Called when the activ
我的程序的很多用户都报告了相同错误的“强制关闭”,我无法重现该错误,因此很难调试! 好像和TabHost有关(我的申请里有两个) 现在我尝试扩展 TabHost 覆盖 dispatchWindowFo
我正在使用 Android 中的 Eclipse 创建一个应用程序。我的软件运行完美,直到我创建了一个函数,该函数从我的一个选项卡式 Activiy 创建了一个返回 MainActivity 的新 I
我试图在项目中使用垂直选项卡,但我无法让 tabhost 工作。我认为我没有从 Java 正确进入,但我不确定我做错了什么。虽然例子很多,但似乎已经过时了。看来 tabhost 已经改变了很多,所以我
有人可以帮助我完成这个 TabHost 示例吗?我遇到的问题是,当我尝试运行应用程序时我遇到空指针异常。 这是代码,如果有人需要看一下。 public class TabBarExample exte
我的 TabHost Activity 由于错误而无法正确加载。这是我的代码、xml 和错误日志: public class TabScreen extends TabActivity { @Over
我的应用程序中有一些选项卡,我希望最后一个选项卡在默认系统浏览器中启动谷歌。我认为这会起作用: Uri uri = Uri.parse("http://www.google.com/"); tabHo
我想要不同数量的选项卡并且我正在使用 TabHost。这些可能在 1 到 8 之间,具体取决于数据。 我想添加水平滚动条,这样当所有 8 个滚动条都在那里时,它看起来就不会显得局促。 问题是当有 5
我在 TabHost 中有一个 FrameLayout。我收到以下错误。如何让它在 Eclipse 中呈现? Error during post inflation process: The Fram
我在主布局中使用 TabHost,目前只有 2 个选项卡。如果我在第二个选项卡上并更改方向,应用程序会将我返回到第一个选项卡。有什么办法可以防止这种情况发生吗? 最佳答案 将以下代码添加到定义了 ta
我正在创建总共有 3 个 Activity 的简单应用程序 登录 - 具有用户名、密码字段以及登录和注册按钮 注册 - 具有各种表单字段和提交按钮 留言-登录成功后我们就来参加这个 Activity
我这里发生了一些奇怪的事情! 我有一个 Tabhost,有 3 个选项卡。在我的模拟器中,它运行良好,来回运行。但是在我的平板电脑(HP Touchpad 和 Samsung Galaxy Tab 1
我的目标是创建两个选项卡,每个选项卡都有不同的 Activity 。我希望选项卡始终在顶部可见,以便我可以轻松地在两者之间切换。我相信已经设置好一切以使用 tabHost 创建两个选项卡,但是当我运行
我是一名优秀的程序员,十分优秀!