1

我一直使用这个例子作为我项目的基础。

我已将项目更改为对标题片段的 ListItems 使用 ArrayAdapter,并更改了 DetailsFragment 的视图以显示自定义布局,该布局作为应将条目添加到数据库中的按钮。

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

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

我在详细信息片段的自定义布局中的按钮在其 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: 无法启动接收器 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;
    }
}
4

1 回答 1

0

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

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

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

公共静态 SherlockFragmentActivity 活动实例;

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

于 2013-08-11T13:14:17.980 回答