use*_*730 1 android android-fragments
我仍然对 Google 在 Android API 中放置一个有时有效有时无效的方法感到困惑;即Fragment.getActivity(). 我知道,我可以检查结果是否正确null,也有isAdded()方法。但是,当这些检查结果为阴性时,我该怎么办?当我走到这一步时,我想要访问 是有原因的Activity,比如访问Resources或Preferences执行 Android 中需要的无数事情之一Context。
我根本无法做我要做的事情。但是,我认为如果我的应用程序有时执行用户选择的操作,有时不执行,那么用户体验将会很差。事实上,我认为让我的应用程序崩溃也不会更糟糕。
或者我可以告诉用户有关分离的活动,并且他应该稍后再试。但是等等,Toast需要一个Context,所以我什至不能这样做。
或者我应该像这样等待活动重新附加?
Activity activity = getActivity();
while (activity == null) {
Thread.sleep(10);
activity = getActivity();
}
Run Code Online (Sandbox Code Playgroud)
(我并不是认真地提出这个,我只是想说明我有多么绝望)
也许我对这一切的思考都是错误的。也许我试图以错误的方式做事。也许有一种我没有听说过的关于如何使用 Fragment 的思想流派。但是,如果我应该避免访问Activitya 中的the Fragment,为什么该getActivity()方法首先存在在那里?
我现在遇到的具体问题是,我想给用户一条PreferenceFragment消息:OnSharedPreferenceChangeListenerToast
Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();
Run Code Online (Sandbox Code Playgroud)
这在大多数情况下都有效,但有时会因为getActivity()返回而崩溃null。
在通常情况下,一旦附加,您将始终在片段中拥有活动,因为活动只有在片段被销毁后才会被分离(并且永远不会重新附加)。请参阅 Android 的片段生命周期图:https://developer.android.com/guide/components/fragments。我能想到的唯一问题是当您使用另一个线程或发布 Runnable 并引用 Fragment 的回调时。在这种情况下,可以在 Fragment 分离并销毁后调用回调。现在,通常在这种情况下,您想要转储正在执行的操作并退出,因此只需检查 getActivity 是否为 null 并且什么都不做。如果即使 Fragment 被销毁,您也必须执行某些操作,那么如果您仅需要资源等的上下文,则可以安全地使用 ApplicationContext,您可以安全地在应用程序的生命周期中保留它。如果您需要 UI 上下文,例如向用户显示 Toast,则 ApplicationContext 将不起作用。在这种情况下,您将不得不重新设计代码,使 Activity 是处理回调和函数的代码,而不是 Fragment。这一切都是假设 Activity 仍然存在。
| 归档时间: |
|
| 查看次数: |
1064 次 |
| 最近记录: |