【问题标题】:Callback after orientation change becomes null方向改变后的回调变为空
【发布时间】:2012-12-01 03:04:11
【问题描述】:

我有一个FragmentActivity,其中有两个标签是ListFragments。每个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 中,我有一个ImageButton,它将调用一个DialogFragment,它也有一个回调。这个回调是在我的ListFragment 中实现的,它触发了 null

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

    // Update stuff

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

问题是,如果我在应用程序运行时旋转手机,mStatusUpdateCallback 将变为 null。这当然意味着我无法执行回调。有谁知道如何解决这个问题?

我的尝试

根据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)

【问题讨论】:

  • onConfigurationChange方法中初始化callbacks
  • 从您发布的代码中很难判断发生了什么。理论上不应该发生这种情况。我有类似的设置,但我没有看到空指针。能发一下logcat吗?
  • @MMohsinNaeem 先看代码:)
  • @Marco 我已经添加了一个我从中调用它的位置以及堆栈跟踪。
  • 嗯,仍然很难说出发生了什么。作为替代方案,您可以使用支持库附带的 LocalBroadcastManager 来传递数据/消息(stackoverflow.com/questions/8802157/…)。或者您也可以使用 EventBus 库,例如 GreenDroid 的 Otto 或 EventBus。

标签: android android-fragments android-orientation


【解决方案1】:

Activity的配置被销毁并重新创建时。

当手机的Configuration改变时,调用onConfigurationChange方法。

所以你可以在onConfigurationChange中初始化你的Callbacks

【讨论】:

    【解决方案2】:

    首先您可以将此代码放入清单标签并强制活动以保存您的回调android:configChanges="orientation|screenSize" 其次,您可以使用 onConfigurationChange 方法来初始化您的回调

    【讨论】:

      【解决方案3】:

      默认情况下,当您的应用程序改变方向时,整个活动将被销毁和创建。因此(并且没有发布更多代码),可以假设您的引用在活动被破坏时变为空,并且在重新创建活动时需要重置。

      或者,您可以在清单中指定您的活动处理方向更改,然后当方向更改时该活动不会被销毁。

      【讨论】:

      • 感谢您抽出宝贵时间。我确实提到了这些事情,但我想我被困在如何在方向改变后正确恢复引用。
      • 你是如何实例化你的视图的?代码或xml。
      • 布局本身是XML,但我在onCreateView中膨胀了
      猜你喜欢
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      相关资源
      最近更新 更多