簡體   English   中英

Android - 在橫向和縱向模式之間切換會使 Intent 失去價值

[英]Android - switching between landscape and portrait mode makes Intent lose values

我正在使用 Intents 在我的 Android 應用程序中的活動之間切換。 我將數據放入 Intent 以供下一個活動使用。 當我在橫向和縱向模式之間切換手機時,從意圖傳遞的值丟失並且我得到 NullPointerException。

有人可以告訴我可能出了什么問題。

有很多代碼可以完全發布。 但是如果有人需要查看代碼的特定部分,我可以在這里發布。

編輯
我解決了 state 沒有被保存的問題。 但我面臨的另一個問題是屏幕上的按鈕在方向改變后都不起作用。 按下按鈕時,我在 LogCat 中收到此警告

02-25 23:07:49.190: WARN/WindowManager(58): No window to dispatch pointer action 0

請幫忙。

當您切換方向時,將重新創建活動並調用 onCreate,因此您必須使用捆綁包保存當前的 state 並在方向更改后恢復。 如果您只有一個帶有 TextView 的應用程序並且您輸入文本並更改方向,您可以看到這一點。 如果您將 state 捆綁到 onCreate 中,您可以抑制這種情況。 這可能也是為什么在方向改變后你有一個 NullPointer 的原因。 這很煩人,但我們必須忍受。

這個關於一系列定向教程的鏈接,尤其是第一個教程,應該可以幫助您准確了解正在發生的事情以及如何成功維護您當前的 state。

更新:還有一篇關於 SO Activity restart on rotation Android的帖子處理幾乎相同的事情。

編輯后續問題:

您是否在方向更改后重新附加了單擊處理程序?

把它寫在你的清單文件中……你想要這個在哪個活動中——

 android:configChanges="orientation|keyboardHidden"

編輯:將此用於新的 API 版本——

android:configChanges="orientation|keyboardHidden|screenSize"

肯定會起作用的。。

嘗試這個:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString(SOME_KEY, "blah blah blah");
}

@Override
public void onCreate(Bundle savedInstanceState) {
   ...
   somevalue = savedInstanceState.getString(SOME_KEY);
   ...
}

可以使用“orientation”值聲明屬性 android:configChanges,這將阻止活動重新啟動。 相反,活動保持運行並調用其 onConfigurationChanged() 方法。

在清單中聲明< android:configChanges="orientation|keyboardHidden"/> 這使您可以自己管理方向/鍵盤可見性的更改。 當然,你不需要重寫回調方法來管理它。

您好我也遇到了這個問題。 為我解決的問題是:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putString("Username", mUsername);
    savedInstanceState.putString("Password", mPassword);
    savedInstanceState.putString("UserID", mUserID);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

然后在 onCreate() 中:

if (savedInstanceState == null) {
    Bundle extras = getIntent().getExtras();
    if(extras == null) {
        mUsername = "?";
        mPassword = "?";
        mUserID = "?";
    } else {
        mUsername = extras.getString("Username");
        mPassword = extras.getString("Password");
        mUserID = extras.getString("UserID");
    }
} else {
    mUsername = (String) savedInstanceState.getSerializable("Username");
    mPassword = (String) savedInstanceState.getSerializable("Password");
    mUserID = (String) savedInstanceState.getSerializable("UserID");
}

那么您可以確定對象不是 null。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM