Articles of android fragments

调用replace()时片段的生命周期是多少?

我有许多片段,使用以下代码动态添加: private class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { selectItem(position); } } private void selectItem(int position) { // update the main content by replacing fragments Fragment fragment = null; if(position == 0){ fragment = new FirstFragment(); } else if(position == 1){ fragment = new SecondFragment(); […]

如何在单/双窗格布局中管理UI状态和后端堆栈

我无法解决如何在典型的列表细节设计模式中正确管理Fragment的问题。 我的布局工作正常,横向视图(双窗格)的结构如下: 像这样的纵向视图(单个窗格): 我还在res/values-w600dp/有一个refs.xml ,以确保根据设备的屏幕宽度加载适当的布局。 选择列表项时,横向视图应并排显示列表和详细信息,而纵向视图应仅显示全屏详细信息。 如果未选择任何内容,则横向视图应显示左侧的左侧和右侧的空白区域,而纵向视图应仅显示全屏列表。 但是,这是我遇到麻烦的地方: 我是否对列表+可选的详细信息布局使用“主” Activity ,为肖像,仅详细信息布局使用另一个“详细信息” Activity ? 这似乎是Fragments指南示例所做的。 我已经得到了这个普遍的工作,但是当方向改变时,我如何保持我的细节片段的状态? 考虑上面显示的相反情况 – 从纵向旋转到横向,同时细节可见意味着细节Activity需要finish()因此主Activity可以显示双窗格布局,但这也会破坏细节片段和它的savedInstanceState 。 如果用户在详细信息片段中的EditText字段中键入了信息,然后旋转设备,当我将其添加到主(双窗格) Activity时,如何保留详细信息片段的整个UI状态? 我是否只使用一个Activity并自己管理Fragment ? 这允许我在方向改变时保留细节UI的状态(因为Android会自动处理),但是当它返回到堆栈时会变得混乱。 考虑图像中的情况 – 当细节可见时应从横向旋转到纵向应显示单窗格显示详细信息,但如何正确管理后堆栈和ActionBar主页图标以显示列表单窗格? 旋转回到横向还需要撤消我之前执行的任何后向堆栈操作,因为两个片段将立即可见。 经过一番搜索后,我发现了两个类似的问题( 从双窗格切换到单窗格上的方向更改维护片段堆栈和保留活动之间的片段状态 ),但我的情况略有不同,因为我不是要尝试改进此function但是最好预先计划好。 我错过了什么? 当然Android可以同时管理后台堆栈(如多个Activity案例中) 和 UI状态(如单个Activity案例中),对吧?

我不应该使用FragmentManager的executePendingTransactions()(在主线程中)的情况是什么?

我正在学习如何使用片段,到目前为止我遇到了很多小问题。 FragmentManager的executePendingTransactions方法看起来可能有一些自己的,特别是因为官方Android文档中的说明中的这个注释: 如果要立即执行任何此类挂起操作,可以调用此函数(仅从主线程)来执行此操作。 请注意,所有回调和其他相关行为都将在此调用中完成,因此请注意调用它的位置。 http://developer.android.com/reference/android/app/FragmentManager.html#executePendingTransactions() 听起来像是一个非常神秘的警告。 这些“回调和其他相关行为”将如何影响我的申请? 从主线程调用此函数时,这会导致问题吗? 我找不到任何具体的例子,所以我向任何已经揭开这个警告神秘面纱的人寻求帮助:什么是我不应该在主线程中使用executePendingTransactions例子,如果我这样做会发生什么可怕的事情? 或者只要它在主线程中使用它总是安全的吗?

Android Fragment,无需重新创建/重新加载Fragment即可返回

我已经看到了很多关于片段的问题,我似乎还无法弄清楚我想做的事情是否可行,如果我的设计模式只是有缺陷而我需要重新整理处理。 基本上,就像大多数问题一样,我有一个带有NavigationTabs的ActionBar(使用ActionBarSherlock),然后在每个Tab中有一个FragementActivity,然后FragmentActivities在选择一行时推送新的Fragments(我正在尝试重新创建) Android中的iOS项目,它只是一个基于导航的基本应用程序,其中包含一些可以深入查看特定信息的选项卡。 当我单击手机上的后退按钮时,前一个片段被加载但片段重新创建(因此每个视图再次调用WebServices)并且这不需要,因为在以前的视图中信息不会改变倒退。 所以基本上我想知道的是如何设置我的片段,这样当我按下手机上的后退按钮时,之前的片段就会被拉上前面已经创建的项目。 以下是我目前的代码: //This is from my FragmentActivity Class that contains the ActionBar and Tab Selection Control @Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub int selectedTab = tab.getPosition(); if (selectedTab == 0) { SalesMainScreen salesScreen = new SalesMainScreen(); ft.replace(R.id.content, salesScreen); } else if (selectedTab == 1) […]

Android片段工厂方法vs构造函数重载

首先,我已经知道FragmentManager经常会破坏然后使用默认构造函数重新创建Fragment。 编码器必须在工厂方法中将重要事物保存在一个参数包中,然后每次在onCreate(Bundle)中重新创建片段时将它们取出。 public class MyFragment extends Fragment { private static final String MY_STRING_CONSTANT = “param”; private int mIntegerMember; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mIntegerMember= getArguments().getInt(MY_STRING_CONSTANT); } } 我的问题是,这有什么区别: // Inside MyFragment.java public MyFragment() { // No-argument constructor required by the FragmentManager. } public static MyFragment newInstance(int param) { // Factory method MyFragment fragment […]

在不同组中选择的导航抽屉菜单项

我有一个工作的导航抽屉和menuItem.setChecked(true);一些问题menuItem.setChecked(true); 在菜单中使用组和标题时。 它没有按预期突出显示菜单项。 这是我的XML: 如您所见,我有3个菜单项,然后是包含2个菜单项的设置组,然后是包含3个菜单项的常规组。 现在有了前3个菜单项, menuItem.setChecked(true); 按预期工作,并突出显示该菜单项。 但是,子集(“设置”或“常规”子集)中的以下菜单项均未正确突出显示。 我读到可以封装整个块,但这似乎不起作用。 有什么想法吗? 干杯。 编辑 – 添加了菜单结构的屏幕截图

Android – 由于IllegalStateException导致无法在完成后销毁活动:在onSaveInstanceState之后无法执行此操作

我的应用中有3个片段的活动。 当按下第一个按钮时,在Activity中调用一个方法来执行一些不相关的东西,然后调用finish() 。 这会触发片段上的onPause() ,它会执行更多不相关的内容,然后调用super.onPause() 。 然后应用程序加载它出现的旧Activity(逻辑上跟随视图堆栈),并在Fragment上调用onDestroyView()时突然崩溃并出现以下exception: FATAL EXCEPTION: main java.lang.RuntimeException: Unable to destroy activity {be.niteowl.niteowl.debug/be.niteowl.niteowl.views.activities.VenueActivity}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2793) at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:2811) at android.app.ActivityThread.access$2100(ActivityThread.java:123) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:972) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3835) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.IllegalStateException: Can not […]

ActionBarActivity后退按钮不会从后台popup

我正在使用这个模板https://github.com/kanytu/android-material-drawer-template只是为了尝试material design所以我实现了一些片段,有些网页视图有些没有。 我的问题是当在片段之间切换时我可以看到它们被成功添加到后台堆栈中 getFragmentManager().beginTransaction().replace(R.id.container, new FAQ()).addToBackStack(“FAQ”).commit(); 但是当我按下后退按钮时,它就会关闭应用程序。 当我将其更改为使用Activity而不是ActionBarActivity ,导航工作正常,但我失去了一些其他function。 后退按钮上有一个覆盖 @Override public void onBackPressed() { if (mNavigationDrawerFragment.isDrawerOpen()) mNavigationDrawerFragment.closeDrawer(); else super.onBackPressed(); } 但即使被删除它仍然会发生。 我认为问题出在super.onBackPressed某个地方 ActionBarActivity有没有理由打破后退按钮?

“new A()”和“A.newInstance()”之间有什么区别?

什么时候我更喜欢一个? 下面显示的方法的目的是什么? class A { public static A newInstance() { A a = new A(); return a ; } } 有人可以向我解释这两个电话之间的区别吗?

Android多片段事务排序

我有一个包含(水平) LinearLayout的HorizontalScrollView ,我将其用作添加多个片段的容器。 在进行一些更改后,我需要从该容器中删除所有片段并添加新片段。 但是,当我删除旧片段时,排序似乎存在问题。 以下是场景: 应用启动 按此顺序正确添加片段A1 , B1 , C1 , D1 改变内容 如果不删除初始片段,但添加A2 , B2 , C2 (作为单个事务),它将显示A1 , B1 , C1 , D1 , A2 , B2 , C2 如果删除初始片段(作为单独的或使用相同的事务),然后添加A2 , B2 , C2 ,它将显示C2 , B2 , A2 现在我find了一个解决方法,我先添加新的片段,然后删除旧的片段(仍然是同一个事务的一部分)并且正常工作。 编辑:解决方法不能一直工作。 我正在使用android.support.v4.app.Fragment 。 关于发生了什么的任何想法?