从插入另一个活动的片段中访问活动

时间:2013-08-11 12:33:12

标签: android view android-activity broadcastreceiver fragment

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

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

除了在示例中生成小部件之外,我只是将自定义XML扩展到FrameLayout,而不是布局的“layout-land”版本中的TitlesFragment。

我的问题源于这样的事实:在横向模式下,DetailsFragment会插入MainActivity,但如果它处于纵向模式,则会获得它自己的DetailsActivty。

我在自定义布局中为详细信息片段设置的按钮在其onClick()中调用一个名为AddNewItem的函数。

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

看起来像这样:

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:无法启动接收器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;
    }
}

1 个答案:

答案 0 :(得分:0)

  

我的问题源于DetailsFragment插入的事实   在横向模式下的MainActivity,但它是自己的   DetailsActivty,如果它处于纵向模式。

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

此外,如果行为对两个活动都是通用的,那么您可以使用该方法创建一个基本活动,并让两个当前活动继承该活动,因此无论如何它都可用于片段。

  

public static SherlockFragmentActivity activityInstance;

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