我一直使用这个例子作为我项目的基础。
我已将项目更改为对标题片段的 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;
}
}