0

我一直在尋找解決方案,以便在手機更改方向時如何讓我的應用不會丟失數據。我找到了一個,它將這行代碼添加到Android清單中。所以,我做到了:Android方向更改丟失數據解決方案無法正常工作

<?xml version="1.0" encoding="utf-8"?> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:roundIcon="@mipmap/ic_launcher_round" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity" 
     android:configChanges="orientation|keyboardHidden"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

我的數據還是迷路時方向的變化,任何人都可以幫我嗎?非常感謝你。

我的Java代碼:

public class MainActivity extends AppCompatActivity { 
int scoreofShooter1 = 0; 
int scoreofShooter2 = 0; 

@Override 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

public void addOneForShooter1(View view) { 
    scoreofShooter1 = scoreofShooter1 + 1; 
    displayForShooter1(scoreofShooter1); 
} 

public void addTwoForShooter1(View view) { 
    scoreofShooter1 = scoreofShooter1 + 2; 
    displayForShooter1(scoreofShooter1); 
} 
public void addThreeForShooter1(View view) { 
    scoreofShooter1 = scoreofShooter1 + 3; 
    displayForShooter1(scoreofShooter1); 
} 

public void addFourForShooter1(View view) { 
    scoreofShooter1 = scoreofShooter1 + 4; 
    displayForShooter1(scoreofShooter1); 
} 

public void addOneForShooter2(View view) { 
    scoreofShooter2 = scoreofShooter2 + 1; 
    displayForShooter2(scoreofShooter2); 
} 

public void addTwoForShooter2(View view) { 
    scoreofShooter2 = scoreofShooter2 + 2; 
    displayForShooter2(scoreofShooter2); 
} 
public void addThreeForShooter2(View view) { 
    scoreofShooter2 = scoreofShooter2 + 3; 
    displayForShooter2(scoreofShooter2); 
} 

public void addFourForShooter2(View view) { 
    scoreofShooter2 = scoreofShooter2 + 4; 
    displayForShooter2(scoreofShooter2); 
} 

public void resetScoreOfShooter1(View view) { 
    scoreofShooter1 = 0; 
    displayForShooter1(scoreofShooter1); 
} 

public void resetScoreOfShooter2(View view) { 
    scoreofShooter2 = 0; 
    displayForShooter2(scoreofShooter2); 
} 

public void displayForShooter1(int score) { 
    TextView scoreView = (TextView) findViewById(R.id.shooter_1_score); 
    scoreView.setText(String.valueOf(score)); 
} 


public void displayForShooter2(int score) { 
    TextView scoreView = (TextView) findViewById(R.id.shooter_2_score); 
    scoreView.setText(String.valueOf(score)); 
} 

}

+1

的[保存數據並改變方向]可能的複製(http://stackoverflow.com/questions/12214600/save-數據和變化的方向) –

+0

嗨,對不起,它看起來像一個重複的,但我已經讀過這個話題,並不明白我的錯誤在哪裏,所以我會非常高興,如果有人幫助我的這個問題的具體情況,非常感謝你的理解。 – Veranicus

回答

1

更改此:

android:configChanges="orientation|keyboardHidden"> 

到:

android:configChanges="orientation|keyboardHidden|screenSize"> 

「定位」: 屏幕方向已更改 - 用戶已旋轉 設備。

注意:如果您的應用程序面向API級別13或更高(如通過中的minSdkVersion和targetSdkVersionattributes宣佈 ),那麼你應該 還申報「屏幕尺寸」的配置,因爲它也改變 時之間的設備切換肖像和風景取向。

0

你的解決方案是在本great article

也許hackiest和濫用最廣泛的解決方法是通過設置在Android禁用默認的破壞,和重建的行爲表示不好的做法:configChanges在屬性您Android清單。這種方法的表面簡單性使其對開發人員非常有吸引力;但Google工程師不鼓勵使用它。主要關心的是它要求您在代碼中手動處理設備配置更改。處理配置更改要求您採取很多額外的步驟,以確保每個字符串,佈局,可繪製,尺寸等與設備的當前配置保持同步,並且如果您不小心,應用程序可以很容易地擁有一個整體作爲結果的一系列資源特定的錯誤。

另一個原因是谷歌不鼓勵其使用,因爲許多 開發商錯誤地認爲設置 機器人:configChanges =「方向」(例如)將神奇 保護他們的應用程序無法預知的情況,其中 基本活動將被銷燬並重新創建。這不是 的情況。配置更改可能會由於多種原因而發生 - 不僅僅是屏幕方向更改 。將您的設備插入顯示器底座 更改默認語言並修改設備的默認字體比例因子只是可觸發設備配置更改的事件的三個​​示例,所有這些事件都表示系統將銷燬 並重新創建所有設備當前正在運行的活動下一次他們是 恢復。因此,設置android:configChanges屬性通常不是很好的做法。

有兩種情況:1 如果你只需要保存一些屬性只使用onSavedInstanceStateonRestoreInstanceState

2 - 如果你有,你有正在運行的線程,AsyncTasks,插座更復雜的情形。 你可以:

1-管理對象內部的殘留片段所描述here

2-更好的解決方案是使用設置是爲了解決這一確切的問題loaders

從Android的文檔:

  • 如果您獲取直接在活動或片段中的數據,您的用戶將缺乏響應遭受由於從UI線程執行可能慢查詢。

  • 如果你從另一個線程獲取數據,也許的AsyncTask,那麼你負責管理線程和UI線程 通過各種活動或片段生命週期事件雙方,如 的onDestroy()和配置變化。

裝載機解決了這些問題,幷包括其他好處。例如:

加載程序在單獨的線程上運行以防止janky或無響應的UI。 當發生事件時,加載程序通過提供回調方法來簡化線程管理。加載程序持續並緩存配置 更改以防止重複查詢。裝載程序可以實現一個 觀察器來監視基礎數據源中的更改。例如,對於 示例,CursorLoader會自動註冊一個ContentObserver到 ,當數據更改時觸發重新加載。

特定的情形

使用下面的代碼:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (savedInstanceState != null) { 
     scoreofShooter1 = savedInstanceState.getInt("scoreofShooter1"); 
     scoreofShooter2 = savedInstanceState.getInt("scoreofShooter2"); 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("scoreofShooter1", scoreofShooter1); 
    outState.putInt("scoreofShooter2", scoreofShooter2); 
} 
+0

鏈接[2]壞了/不是有效的鏈接 – Zharf

+0

謝謝,我更新了我的鏈接 – humazed

+0

嗨,非常感謝你的幫助。第一個發佈的解決方案是一個不好的做法,但我的應用程序並不複雜,我可以通過onSavedInstanceState和onRestoreInstanceState完成,問題是我不知道如何實現這一點,並相信我已經嘗試過並閱讀噸的文件,但我的技能很低,即使這對我來說是一個問題,我是一個完整的初學者。我已經將我的Java代碼發佈到了我的第一篇文章中,所以如果你願意這麼友善並期待它,並且只是發佈了一些精確的代碼,我就可以在那裏工作 – Veranicus

相關問題