我的申请中只有一个activity和多个fragments.
两个主要片段A(左)和B(右).
Fragment A1 called from A
B1 called from B
B2 called from B1
Run Code Online (Sandbox Code Playgroud)
所有fragments都有单独的后退按钮.
因此,当我按下fragment A1的后退按钮时,它应该返回到A,同样当按下B2的后退按钮时,B1出现,从B1到B,依此类推.
如何实现这种功能?
我已经实现了Navigation Drawer,它是Activity的子类.我的应用程序中有很多片段.我的问题在这里
想象一下有3个片段:
Fragment_1:Fragment_2:Fragment_3
当我启动我的应用程序时,Fragment_1被加载当我点击Fragment_1上的一些组件时,我将导航到Fragment_2,依此类推.
所以它就像
Fragment_1> Fragment_2> Fragment_3
当我从Fragment_2按回键时,我被导航回Fragment_1但是当我从Fragment_3按回键时,我被导航回Fragment_1(而不是Fragment_2)
我在Back Key按下的应用程序中想要这样的东西
Fragment_1 <Fragment_2 <Fragment_3
我使用Fragment,FragmentManager,FragmentTransaction如下:
MyFragment fragment = new MyFragment();
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(null)commit();
Run Code Online (Sandbox Code Playgroud)
我尝试在我的MainActivity中覆盖onBackPressed():
@Override
public void onBackPressed() {
getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
int count = getFragmentManager().getBackStackEntryCount();
if (count == 0)
super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud) 我正在BottomNavigationViewAndroid应用中实现导航.我正在使用Fragments为每个选项卡设置内容.
我知道如何为每个选项卡设置一个片段,然后在单击选项卡时切换片段.但是,如何为每个选项卡分别设置一个后备堆栈?以下是设置一个片段的代码:
Fragment selectedFragment = ItemsFragment.newInstance();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.content, selectedFragment);
transaction.commit();
Run Code Online (Sandbox Code Playgroud)
例如,FragmentA和B将位于选项卡1下,FragmentC和D位于选项卡2下.启动应用程序时,将显示片段A并选择选项卡1.然后Fragment可以用片段B替换A.当选择标签2时,应显示片段C. 如果选择了选项卡1,Fragment则应再次显示B. 此时,应该可以使用后退按钮显示片段A.
以下是fragment在同一选项卡中设置的代码:
Fragment selectedFragment = ItemsFragment.newInstance();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.content, selectedFragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud) android android-fragments fragment-backstack bottomnavigationview
我已经为Adapter类实现了Section Indexer,它扩展了BaseAdapter.现在,对于第一次启动,Section Indexer正确显示叠加层.但是当列表的内容更新时,Section Overlay不会更新并给出ArrayOutOfBoundException.对于一个修复我做的是我做了listview.setFastScrollEnabled(false); 更新适配器内容; 然后listview.setFastScrollEnabled(true); 现在发生的事情是叠加得到更新,但叠加层将出现在列表视图的左上角.我怎样才能解决这个问题.
我发现了一些与此问题有关的讨论,但没有明确或明确的.
构建基于选项卡的应用程序,似乎不得不在(A)使用TabHost与每个屏幕的活动和(B)为每个屏幕使用带有碎片的ActionBar之间进行选择.这引出了一些问题:
1)这是真实的困境,还是可以使用具有不同活动的ActionBar.
2)如果困境是真实的,那么为什么这样设置?Google是否计划弃用TabHost以及基于标签的导航的多活动方法?多活动方法有什么不利之处吗?
3)如果两种方法都将继续得到支持,每种方法的优缺点是什么?如果我选择ActionBar + Fragments,我会遇到任何陷阱吗?例如,当我希望我的一个选项卡式屏幕滑过/弹出一个额外的屏幕/片段时,我是否会在ActionBar中切换到/从选项卡切换到有趣的行为?
我正在搞制表演.
我想在tabcontent(framelayout)下面显示我的tabwidget.
我通过将tabwiget选项卡属性设置为来完成它
android:gravity="bottom"
Run Code Online (Sandbox Code Playgroud)
但是framelayout无法与这些标签对齐.
也就是说,标签显示在屏幕的底部并与framelayout重叠
怎么做?如果设置一个高度值到framelayout它没有针对android的所有屏幕进行优化.我能做什么?任何的想法???
我有一个Android应用程序,只有一个活动.该活动包含一个带有ViewPageAdapter的SlidingTabLayout,如本例所示.每个选项卡都包含一个相应的根片段,然后当用户使用该屏幕时,我将其替换为其他片段.可视化表示如下所示:
使用我当前的实现,我执行以下操作:转到tab1,通过将ProductRootFragment替换为ProductListFragment立即加载ProductListFragment.我点击了一个产品,它用ProductDetailFragment替换了ProductListFragment.现在我切换到tab2并通过替换Tab2RootFragment立即加载Tab2ListFragment.我单击一个项目,Tab2DetailFragment替换Tab2ListFragment.我现在返回到Tab1,正如我所料,仍然显示ProductDetailFragment.但是,如果我现在单击后退按钮,它不会像我期望的那样将我带回到ProductListFragment.相反,它从Backstack中弹出Tab2DetailFragment.
我想为每个"tab"片段实现一个单独的backstack.有几个关于这个的帖子,但它们似乎都已经过时了,有些人提出了非常精细的解决方案.(见这里,这里和这里 ......)
似乎在最新版本的SDK中,Android可以自动处理这种backstack层次结构,而无需在我更换片段的事务中使用getChildFragmentManager而不是getSupportFragmentManager来手动实现某种后台堆栈.但是,我无法让它发挥作用.(我直觉地认为正确的解决方案就是让Android处理这个问题,因为感觉就像手动覆盖后退按钮并实现自己的堆栈一样精心设计.)
有人可以解释如何正确实现预期的行为,其中为每个选项卡维护单独的backstack?或者可能链接到一个简单,精心设计和最新的如何实现所需行为的示例?
有关我的代码的其他信息:在我的MainActivity.java中,我使用getSupportFragmentManager()构造ViewPagerAdapter.
ViewPagerAdapter.java
@Override
public Fragment getItem(int position) {
switch(position){
case 0: return new ProductRootFragment();
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
ProductRootFragment.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.product_root_fragment, container, false);
FragmentTransaction transaction = getFragmentManager()
.beginTransaction();
transaction.replace(R.id.product_root_container, new ProductListFragment());
transaction.commit();
return view;
}
Run Code Online (Sandbox Code Playgroud)
ProductListFragment.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.product_list_fragment, container, false);
view = (ProductListView) …Run Code Online (Sandbox Code Playgroud) 我最近开始在FragmentActivity中的标签主机内部开发一个带有片段的应用程序.由于TabActivity类现已弃用,因此Android文档说这样做.为了使用片段,我使用的是android v4支持库.
目前我的应用程序包含一个选项卡,其中存在片段.要导航到选项卡中的新片段,我一直在使用以下代码(根据文档似乎是正确的):
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(containerId, newFragment);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
一切顺利,直到我按下后退键导航到前一个片段并意识到我的所有视图状态几乎都被破坏了......发生的事情是onCreateView()方法在我之前的片段上再次被调用即使之前已经创建了它的观点......为什么会这样?我已经四处搜索了如何使用片段正确维护状态,但我似乎无法在此找到合适的文档.
然后我尝试使用的是
ft.add(containerId, newFragment);
Run Code Online (Sandbox Code Playgroud)
代替
ft.replace(containerId, newFragment);
Run Code Online (Sandbox Code Playgroud)
这实际上工作得很好,因为我的视图状态被保留了 - 每次显示我之前的片段时都没有调用onCreateView().然而,我接着注意到的是,我可以与位于当前片段下方的先前片段的组件(按钮等)进行交互,即使我看不到组件!?我在某处读到应该使用以下方法来保存一些状态:
public void onSaveInstanceState (Bundle outState)
Run Code Online (Sandbox Code Playgroud)
我实现了这个方法,但它从未被调用过!我还注意到,过去onCreateView()和onActivityCreated()方法的bundle总是为null.谷歌肯定没有这么难以实现这样的事情,我必须遗漏一些东西?任何有关如何正确维护片段视图状态的帮助将不胜感激!
谢谢.
我有以下场景.tabhost管理四个ListFragmnet.对于每个ListFragment,我都有几个片段.例如,与ListFragmnet 1相关联,我有片段A,B,C,并且可以发生片段A"启动"片段B,它可以启动片段C.是否正确允许片段相互启动或者是否有更正确的方法?
谢谢
编辑:
TabFragmentActivity:
tab1(ListFragment): fragment 1 -> fragment 2 -> .... -> fragment N
tab2(ListFragment): fragment 1 -> fragment 2 -> .... -> fragment N
tab3(ListFragment): fragment 1 -> fragment 2 -> .... -> fragment N
tab4(ListFragment): fragment 1 -> fragment 2 -> .... -> fragment N
Run Code Online (Sandbox Code Playgroud)
这是想要实现的.那么,我的问题是,每个标签管理从片段1到片段N的事务的最佳方法是什么?
再次谢谢
我正在创建支持的应用程序Android 2.2 to Android 4.1.该TabHost是deprecated in Android version 3.2.但所有应用程序都支持创建的应用程序versions.但我想创建Tab bar一个看起来像tab bar in Android 4.1运行应用程序的应用程序Android 4.2,如果我在下面的android 3.2 version设备中运行应用程序,它必须看起来像tab bar在该设备中.我怎样才能做到这一点.?
我正在使用来自流行病回答的信息在我的应用中创建标签
我创建了处理标签的主类,这个类extends TabActivity并创建了标签:
Resources res = getResources();
TabHost tabHost = getTabHost();
TabHost.TabSpec spec;
Intent intent;
intent = new Intent().setClass(this, stackA.class);
spec = tabHost.newTabSpec("tab1").setIndicator("Tab 1",
res.getDrawable(android.R.drawable.ic_menu_search))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, stackB.class);
spec = tabHost.newTabSpec("tab2").setIndicator("Tab 2",
res.getDrawable(android.R.drawable.ic_menu_search))
.setContent(intent);
tabHost.addTab(spec);
tabHost.setCurrentTab(0);
Run Code Online (Sandbox Code Playgroud)
然后为每个选项卡创建FragmentActivity,这样就可以在每个选项卡中创建堆栈.我的片段已创建:
protected void navigateTo(Fragment newFragment) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.replace(R.id.content, newFragment);
ft.addToBackStack(null);
ft.commit();
}
public class fragmentA extends Fragment{
private LinearLayout ll;
private FragmentActivity fa;
public View onCreateView(LayoutInflater inflater, ViewGroup container, …Run Code Online (Sandbox Code Playgroud)