我一直使用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;
}
}
答案 0 :(得分:0)
我的问题源于DetailsFragment插入的事实 在横向模式下的MainActivity,但它是自己的 DetailsActivty,如果它处于纵向模式。
这应该不是问题。虽然您有两个活动,但在这两个活动中都有相同的DetailsFragment
类。如果来自该片段的Button
正在做某事,那么你应该将它保持在该片段的级别(这将是一个理想的片段,一个自包含的片段,一个不知道或不关心放在哪里的片段)。如果您确实需要该方法中的工作活动,则应添加额外的详细信息。
此外,如果行为对两个活动都是通用的,那么您可以使用该方法创建一个基本活动,并让两个当前活动继承该活动,因此无论如何它都可用于片段。
public static SherlockFragmentActivity activityInstance;
不要对活动保持静态引用,否则可能会泄露它们。
此外,不要从他们自己的上下文之外访问活动。当一个活动不是与用户交互的活动(它已被调用onPause()
)时,该活动也可能被彻底销毁,并且尝试在另一个活动中访问它可能会给您带来很多问题。