6

FragmentActivity私はsである2つのタブを持つを持っていますListFragment。それぞれListFragmentにコールバックがあります。

コールバックの例

コールバックはonAttach(...)メソッド内に関連付けられています

OnStatusUpdateListener mStatusUpdateCallback;

public interface OnStatusUpdateListener {
    public void onStatusUpdate();
}

@Override
public void onAttach(Activity activity) {
    Log.d(TAG, "onAttach");
    super.onAttach(activity);

    try {
        mStatusUpdateCallback = (OnStatusUpdateListener)activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + " must implement OnStatusUpdateListener");
    }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    Log.d(TAG, "onCreate");
    super.onCreate(savedInstanceState);

    setRetainInstance(true);
}

後で、FragmentActivity正常に機能するこのコールバックによって通信します。

内にListFragment、コールバックもあるImageButtonaを呼び出すがあります。DialogFragmentこのコールバックはmyに実装されており、 nullListFragmentのコールバックをトリガーします。

public void onStatusOption() {
    Log.d(TAG, "onStatusOption");

    // Update stuff

    // Here is where mStatusUpdateCallback is null after rotate
    mStatusUpdateCallback.onStatusUpdate();
}

問題は、アプリケーションの実行中に電話を回転させると、mStatusUpdateCallbacknullになることです。もちろん、これはコールバックを実行できないことを意味します。誰かがこれを修正する方法を知っていますか?

私が試したこと

https://stackoverflow.com/a/6029070/935779によると、への新しい参照OnStatusUpdateListenerが作成された可能性があるため、古い参照を参照できませんが、解決策を提供していません。

https://stackoverflow.com/a/6787393/935779に従って状態を保持しようとしましたが、私が知る限り、コールバックへの参照を保存できません。

android:configChanges="orientation|keyboardHidden"また、それはハックのように見え、私のレイアウトが横向きに変わるので、私は実際にはこの方法を実行したくありません。

スタックトレース

FATAL EXCEPTION: main
java.lang.NullPointerException
    at com.blug.blah.Fragment.StatusFragment.onStatusOption(StatusFragment.java:197)
    at com.blug.blah.MyActivity.onStatusOption(MyActivity.java:243)
    at com.blug.blah.Dialog.StatusOptionDialog$1$1.onClick(StatusOptionDialog.java:108)
    at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:158)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4627)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    at dalvik.system.NativeStart.main(Native Method)
4

3 に答える 3

2

存在の構成Activityが破棄されて再作成されるとき。

Configuration電話のが変更されたときにonConfigurationChange呼び出されるメソッド。

だからあなたはあなたのを初期化することができCallbacksますonConfigurationChange

于 2012-12-02T06:59:29.920 に答える
1

まず、このコードをマニフェストタグに入れて、アクティビティを強制してコールバックを保存します。android:configChanges="orientation|screenSize" 次に、onConfigurationChangeメソッドを使用してコールバックを初期化します。

于 2016-11-25T10:19:33.967 に答える
0

デフォルトでは、アプリケーションの向きが変わると、アクティビティ全体が破棄されて作成されます。このため(そしてコードが投稿されていない場合)、アクティビティが破棄され、アクティビティが再作成されたときにリセットする必要があるため、参照がnullになると想定できます。

または、マニフェストで、アクティビティが方向の変更を処理し、方向が変更されてもアクティビティが破棄されないように指定できます。

于 2012-12-01T03:35:15.747 に答える