Articles of android fragments

ViewPager和FragmentPagerAdapter中的片段的Android生命周期管理

我一直在努力找出使用ViewPager正确管理FragmentActivity中FragmentActivity的方法。 在我详细介绍之前,我所面临的问题的快速摘要如下: 我有一个带ViewPager的FragmentActivity 。 ViewPager使用自定义但非常简单的FragmentPagerAdapter 。 ViewPager每个Fragment都包含一个ExpandableListView 。 我还有一个名为“刷新”的操作栏按钮。 现在,让我们假设ViewPager只有一个Fragment 。 创建活动,填充Fragment的ExpandableListView (到目前为止一直很好)。 单击“刷新”按钮时, FragmentActivity的处理方法将迭代分配给FragmentPagerAdapter的Fragments列表,并调用每个Fragment上的refresh()以填充其ListView。 但是,当设备的方向改变时(例如,从纵向到横向),将重新创建活动,片段也是如此。 现在单击“刷新”按钮将迭代未初始化的Fragments 。 我知道我很模糊,特别是没有示例代码,但请耐心等待。 我从应用程序/活动的开头跟踪了问题和方法调用: FragmentActivity.onCreate() FragmentActivity.setContentView() FragmentActivity.createPagerFragments() < – 这将创建一个Fragments的ArrayList,并将它们分配给一个新的FragmentPagerAdapter,而FragmentPagerAdapter又分配给ViewPager。 Fragment.onAttach() Fragment.onCreate() < – 这里没什么特别的,只是调用super方法。 Fragment.onCreateView() < – 这里没什么特别的,只是给布局充气 Fragment.onActivityCreated() < – 这里也没什么。 <> FragmentActivity.onCreate() Fragment.onAttach() Fragment.onCreate() FragmentActivity.setContentView() FragmentActivity.createPagerFragments() Fragment.onCreateView() Fragment.onActivityCreated() <> FragmentActivity.refresh() < – 迭代来自#13的新创建的片段(不是Android的这些片段!)。 <> 所以问题就像我看到的那样:当Android在屏幕方向改变后重新创建FragmentActivity及其Views (上面调用#9-15),它创建了新的Fragment对象,其状态恢复到了原来是。 […]

什么时候片段的onActivityResult被称为片段生命周期?

当我启动Camera intent时,我注意到onActivityResult在fragment生命周期中的onResume之前被调用。 我还注意到在onStart之后onStart onActivityResult 。 但这是奇怪的部分:我有variablesfileUri ==“一些图像路径”。 这个variables是 onStart中的NOT NULL。 onActivityResult中为NULL 在onResume中再次为NOT NULL 看logCat 12-03 14:39:42.418: D/Fragment1(29220): onStart fileUri: file:///mnt/sdcard/OPS_IMAGES/IMG_20121203_143933.jpg 12-03 14:39:42.463: W/PhoneWindow(29220): Previously focused view reported id 2131034140 during save, but can’t be found during restore. 12-03 14:39:42.463: D/Fragment1(29220): onActivityResult fileUri is NULL!!! 12-03 14:39:42.468: D/Fragment1(29220): onResume fileUri: file:///mnt/sdcard/OPS_IMAGES/IMG_20121203_143933.jpg 最糟糕的是,这只发生在50%的时间。 另外50%的onActivityResult可以毫无问题地访问fileUri值… 我该怎么调试这个? 注意:为简单起见,我没有包含onResume,onStart,onActivityResult方法的代码。 它们只是具有variables检查和日志调用的基本方法。 […]

处理片段中的新内容

我正在编写一个使用NFC来读取存储在其上的数据的应用程序。 我的应用程序使用Fragments和Fragment没有onNewIntent()方法。 因为,我正在阅读的数据是通过处理NFC相关操作的单独类完成的,我唯一需要做的就是更新Fragment中的TextView。 但是,此实现也可用于将新Intent传递给Fragment。 这是我当前使用接口的实现。 在收到新的Intent并且NFC相关检查成功后,我正在呼叫监听器。 这是托管Fragment的FragmentActivity。 public class Main extends FragmentActivity implements ActionBar.OnNavigationListener { private Bundle myBalanceBundle; private NFC nfcObj; private NewBalanceListener newBlanceListener; @Override public void onNewIntent(Intent intent) { setIntent(intent); } @Override protected void onResume() { getNFCState(); super.onResume(); } private void getNFCState() { //Other NFC related codes else if (nfc_state == NFC.NFC_STATE_ENABLED){ readNFCTag(); } […]

Android:CursorLoader在非最顶层的Fragment上崩溃

我有一些使用CursorLoader检索其内容的ListFragments。 当用户向下钻取内容时,一个片段替换另一个片段(活动保持不变)。 但是如果内容在非最顶层的片段上发生变化,则应用程序崩溃: E/AndroidRuntime(18830): FATAL EXCEPTION: main E/AndroidRuntime(18830): java.lang.RuntimeException: Unable to resume activity {com.example.ExampleApp/com.example.ExampleApp.ExampleActivity}: java.lang.IllegalStateException: Content view not yet created E/AndroidRuntime(18830): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2120) E/AndroidRuntime(18830): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2135) E/AndroidRuntime(18830): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:957) E/AndroidRuntime(18830): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(18830): at android.os.Looper.loop(Looper.java:130) E/AndroidRuntime(18830): at android.app.ActivityThread.main(ActivityThread.java:3683) E/AndroidRuntime(18830): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(18830): at java.lang.reflect.Method.invoke(Method.java:507) E/AndroidRuntime(18830): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) E/AndroidRuntime(18830): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) E/AndroidRuntime(18830): at dalvik.system.NativeStart.main(Native Method) […]

Android studio AssertionError:不要在dumb模式下从read内部调用waitForSmartMode

自从我更新到Android Studio 2.1 RC后,我一直面临这个问题。 快速谷歌搜索显示使用Android Studio 2.1的开发人员正面临问题。 该问题于4月份出现,尚未find解决方案。

为什么`hasEnrolledFingerprints`给出错误,它只需要我的片段中的权限,而不是Google的示例中的活动?

我正在尝试在我的应用程序中实现Google的指纹API(特别是在我的Fragment中)。 谷歌已经举了一个例子,但它是在一个活动中实现的。 我的具体问题是下面的代码检查是否已经注册了指纹,它给了我一个错误(截图如下): 问题 – >我需要做些什么改变才能使它在我的片段中工作(而不是谷歌这样的活动)? if (!mFingerprintManager.hasEnrolledFingerprints()) { purchaseButton.setEnabled(false); // This happens when no fingerprints are registered. Toast.makeText(getActivity(), “Go to ‘Settings -> Security -> Fingerprint’ and register at least one fingerprint”, Toast.LENGTH_LONG).show(); return; }

如何从FragmentManager中删除以前的堆栈条目?

我有一个活动,我使用以下方法切换片段: public void setCurrentFragment(Fragment fragment) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.setCustomAnimations(R.anim.slide_left_right_in, R.anim.slide_left_right_out, R.anim.slide_right_left_in, R.anim.slide_right_left_out); transaction.replace(R.id.contentFrameLayout, fragment, Integer.toString(fragmentId++)); transaction.addToBackStack(Integer.toString(fragmentId)); transaction.commit(); } 我的导航堆栈如下所示: N-2 – > N-1 – > N. 当某个片段N’打开’时,我想要从后台取出前一个(N-1),所以当我按’后’时我想要恢复N-2片段。 当我在N片段中调用FragmentManager.popBackStack(..)时,它会删除N和N-1片段。 在切换到N片段之前,我试图在N-1片段中调用popBackStack(..)。 但是在那种情况下,N-2片段被恢复,并且仅在显示N片段之后。 我的问题是:有没有办法从backstack中删除以前的片段而不popup当前片段?

Android片段animationonResume

情况如下: 我正在使用API​​ 17引入的子片段。说我有 ActivityA -> FragmentA ActivityA -> FragmentB FragmentA -> ChildFragmentA FragmentA -> ChildFragmentB 所以我在ActivityA->FragmentA->ChildFragmentA ,我使用ActivityA->FragmentA->ChildFragmentB转换到ActivityA->FragmentA->ChildFragmentB ,使用animation添加到backstack并popupbackstack(当我转到ChildFragmentB和animation时有一个animation当我按回并转移到ChildFragmentA)。 现在我导航到ActivityA->FragmentB (FragmentA不再附加)。 当我导航回ActivityA->FragmentA ,其中ChildFragmentB可见时, ChildFragmentB像来自ChildFragmentA时ChildFragmentBanimation。 我想在恢复Activity->FragmentA时禁用此animation。 但是在儿童片段之间转换时要保持它。 此animation在FragmentTransaction中设置。 有没有办法让这种情况发生?

更改方向的单活动应用中的YouTubePlayerSupportFragment

我试图解决这个问题,通过互联网搜索,没有find真正的答案。 我正在开发一款需要YouTube播放器的应用。 此播放器是YouTubePlayerSupportFragment因为它位于支持片段中(因此它也是嵌套的)。 初始设置后,我意识到每当我旋转手机时,video就会停止播放,必须重新启动。 这显然不是我想要的。 然后我发现了一些SO答案( 像这样 ),人们说Activity需要处理配置更改,所以我在清单中的Activity中添加了android:configChanges=”keyboardHidden|orientation|screenSize” 。 这解决了这个问题,video现在即使在方向改变时也能继续播放,全屏旋转看起来并不难看。 很酷,我说,只是意识到这大大困扰了应用程序的其他部分,因为配置现在正在所有视图到位后更新。 这意味着如果我的手机处于纵向模式并且我将其旋转为横向,则正在使用的布局仍然是纵向布局。 我find了解决方案,建议在Activity的onConfigurationChanged(…)调用setContentView(…)并重新onConfigurationChanged(…)片段中的视图,但这似乎是一个相当麻烦的解决方案,因为它不仅仅是一个简单的内容设置我需要,片段需要保留(例如在RecyclerView滚动位置)。 内置的setRetainInstance(true)在这种情况下不起作用,因为视图将使用它重新创建,但是在调用onCreateView(…)时配置仍然是旧的。 如果我可以捕获configChanges事件,如果用户仅在该屏幕(片段)上但在其他任何地方保留Activity娱乐,那将是很好的。 不建议使用更多活动,由于UI / UX原因,我无法为此屏幕和应用程序的其余部分使用单独的活动。

DialogFrag#show()来自片段抛出“IllegalStateException:onSaveInstanceState后无法执行此操作”

为了清楚起见,我已经阅读了关于“IllegalStateException:在onSaveInstanceState之后无法执行此操作”的十几个SO问题,我已经阅读了Alex Lockwood的博客文章http://www.androiddesignpatterns.com/2013/08/片段事务提交状态-loss.html 所以我不是盲目地问这个。 我有一个非常简单的用例案例, 不涉及AsyncTask或任何后台处理。 我有一个包含按钮的片段。 在按钮的onClickListener上,我创建了一个DialogFragment并显示它。 public final class OverviewFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.overview_fragment, container, false); startNewGameButton = (Button) view.findViewById(R.id.buttonNewGame); startNewGameButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final NewGameFragment dialogFrag = NewGameFragment.create(getApplication()); dialogFrag.show(getFragmentManager(), NewGameFragment.FRAGMENT_TAG); } }); } [NewGameFragment] […]