1

この例をプロジェクトのベースとして使用しています。

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;
    }
}
4

1 に答える 1

0

私の問題は、横向きモードの場合は DetailsFragment が MainActivity に接続されているが、縦向きモードの場合は独自の DetailsActivty を取得するという事実に起因します。

これは問題にはなりません。2 つのアクティビティがありますが、DetailsFragment両方に同じクラスがあります。Buttonそのフラグメントの が何かを実行している場合は、そのフラグメントのレベル (理想的なフラグメント、自己完結型のフラグメント、配置場所を知らない、または気にしないフラグメント) に保つ必要があります。そのメソッドの作業にアクティビティが必要な場合は、詳細を追加する必要があります。

また、動作が両方のアクティビティに共通している場合は、そのメソッドを保持するベース アクティビティを作成し、現在の 2 つのアクティビティにそれを継承させることができます。そのため、何があってもフラグメントで使用できます。

public static SherlockFragmentActivity activityInstance;

アクティビティへの静的参照を保持しないでください。リークする危険があります。また、独自のコンテキスト外からアクティビティにアクセスしないでください。アクティビティがユーザーとやり取りするものではない場合 (onPause()呼び出された場合)、そのアクティビティは完全に破棄され、別のアクティビティでアクセスしようとすると多くの問題が発生する可能性があります。

于 2013-08-11T13:14:17.980 に答える