この例をプロジェクトのベースとして使用しています。
titles-fragment の ListItems に ArrayAdapter を使用するようにプロジェクトを変更し、DetailsFragment のビューを変更して、データベースにエントリを追加するボタンとしてカスタム レイアウトを表示しました。
例のようにウィジェットを生成する代わりに、レイアウトの「レイアウトランド」バージョンの TitlesFragment に加えて、カスタム XML を FrameLayout にインフレートするだけです。
私の問題は、横向きモードでは DetailsFragment が MainActivity に接続されているが、縦向きモードでは独自の DetailsActivty を取得するという事実に起因します。
詳細フラグメントのカスタム レイアウトにあるボタンは、その onClick() で AddNewItem という関数を呼び出します。
そのため、ボタンがランドスケープ モードでクリックされると、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: Unable to start receiver in.falkeninc.umt_v0_9_8_1.MyReceiver: java.lang.NullPointerException
何が起こっているのかわかりません。また、BroadcastReceiver 内で到達できるように、DetailsActivity.java で静的変数を使用しているためです。コードは次のようになります。
public class DetailsActivity extends SherlockFragmentActivity {
...
public static SherlockFragmentActivity activityInstance;
...
activityInstance = this; // in the onCreate
...
public static SherlockFragmentActivity getActivityInstance(){
return activityInstance;
}
}