【问题标题】:Access an Activity from a Fragment plugged into another Activity从插入另一个 Activity 的 Fragment 访问 Activity
【发布时间】:2013-08-11 12:33:12
【问题描述】:

我一直使用this example 作为我的项目的基础。

我已更改项目以将 ArrayAdapter 用于titles-fragment 的 ListItems 并更改 DetailsFragment 的 View 以显示自定义布局,该布局作为应将条目添加到数据库中的 Button。

我没有像示例中那样生成小部件,而是在“layout-land”版本布局中的 TitlesFragment 之外,将自定义 XML 膨胀到 FrameLayout 中。

我的问题源于这样一个事实,即 DetailsFragment 在横向模式下插入 MainActivity,但在纵向模式下获得它自己的 DetailsActivty。

我在自定义布局中为 details-fragment 设置的 Button 在其 onClick() 中调用了一个名为 AddNewItem 的函数。

所以当在横向模式下点击 Button 时,它崩溃了,因为 MainActivity 中没有 AddNewItem。我通过使用 BroadcastReceiver 解决了这个问题,因此当单击按钮时,MainActivity.java 中名为 AddNewItem 的方法会广播自定义事件,并且我有一个 BroadcastReceiver,它调用 DetailsFragment.java 中的 AddNewItem。

看起来像这样:

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
        DetailsActivity  m = (DetailsActivity) DetailsActivity.getActivityInstance(); // see below for what getActivityInstance does

        LayoutInflater mInf = LayoutInflater.from(context);

        View myView = mInf.inflate(R.layout.customlayout, null);

        ((DetailsActivity) m).AddNewItem(myView);
    }
}

但这给了我:

08-11 13:37:50.687: E/AndroidRuntime(6766): java.lang.RuntimeException: Unable to start receiver in.falkeninc.umt_v0_9_8_1.MyReceiver: java.lang.NullPointerException

我不确定发生了什么。因为我还在 DetailsActivity.java 中使用了一个静态变量,以便能够在 BroadcastReceiver 中访问它。代码如下所示:

public class DetailsActivity extends SherlockFragmentActivity {
    ...
    public static SherlockFragmentActivity activityInstance;
    ...
    activityInstance = this;   // in the onCreate
    ...
    public static SherlockFragmentActivity getActivityInstance(){
       return activityInstance;
    }
}

【问题讨论】:

    标签: android view android-activity broadcastreceiver fragment


    【解决方案1】:

    我的问题源于 DetailsFragment 已插入 MainActivity 在横向模式下但拥有它自己 如果处于纵向模式,则为 DetailsActivty。

    这应该不是问题。尽管您有两个活动,但它们都有相同的 DetailsFragment 类。如果来自该片段的Button 正在做某事,那么您应该将其保持在该片段的级别(这将是一个理想的片段,一个自包含的片段,一个不知道或不关心放在哪里的片段)。如果您确实需要该方法中的工作活动,则应添加额外的详细信息。

    此外,如果行为对两个 Activity 是通用的,您可以创建一个包含该方法的基本 Activity,并让两个当前 Activity 从该方法继承,因此无论如何它都可用于 Fragment。

    公共静态 SherlockFragmentActivity 活动实例;

    不要保留对活动的静态引用,否则可能会泄露它们。 此外,不要从他们自己的上下文之外访问活动。当一个 Activity 不是与用户交互的那个(它是 onPause() 已被调用)时,该 Activity 也可能被完全销毁,并且尝试在另一个 Activity 中访问它可能会给您带来很多问题。

    【讨论】:

    • 你可能是对的;因为 'm' 变量为空,所以 getActivityInstance() 毕竟不能解决问题。而且正如您所暗示的那样,每次的行为都不会完全相同。我可能不得不在这里复制一些代码。添加新项目的方法很大,我可能已经竭尽全力避免重复。很多人似乎都在说,同时为平板电脑和手机编程是不可避免的。 ://
    • @CupOfQuestions 如果片段(即片段)构建良好,则手机和平板电脑布局的编码应该不会有那么大的问题。此外,使用基类,您可能无需复制 ode 就可以逃脱。另外,那个 huge 方法听起来不太好:)
    • 哈哈,这个方法并没有那么大,只是维护起来很乏味:) 无论如何,我通过创建一个这样的新类解决了这个问题,就像你说的:class BaseDBActivity extends SherlockFragmentActivity { ... public void addNewItem() { ... // 从 10 个小部件获取数据的冗长乏味的代码} 然后 MainActivity 和 DetailsActivity 都扩展了它,现在两者都有一个 addNewItem 并且它们可以工作 :) 谢谢 :)
    • 只是为了让人们稍后再看这个(因为线程不断获得投票),我离开了广播方法/“基础”类方法,而是在 DialogFragment 中的按钮上实现了 onClick 侦听器。所以毕竟没有使用 android:onClick 。 (因为他们只能在自己的活动中调用方法)。 (@Luksprog,我会投票给你,但我还不能!)
    猜你喜欢
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多