2016-02-01 30 views
0

我有一個簡單的程序,可以從活動B更改活動A的背景。 當您更改背景時,需要刷新活動A才能更改背景,查看周圍的計算器後,最簡單的方法是調用重新創建()。爲什麼重新創建循環無限?

我不確定是不是我稱其爲錯誤的或者在錯誤的地區,但什麼最終發生的是它會循環,當應用程序運行,並最終crash-

02-01 13:23:53.358 17302-17302/com.package.www.randomapp E/ViewRootImpl: sendUserActionEvent() mView == null 

這裏以下錯誤的代碼發生的活性

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_mainmenu); 
    backgroundChanger(); 
    recreate(); 
} 

    public void backgroundChanger(){ 
    SharedPreferences sharedGradients = getSharedPreferences("gradientInfo", Context.MODE_PRIVATE); 
    int backgroundGrad = sharedGradients.getInt("backgroundGradient", 0); 


    if (backgroundGrad == 0){ 
     MMBackground.setBackgroundResource(R.drawable.blackgreengradiant); 




    } 
    if (backgroundGrad == 1){ 
     MMBackground.setBackgroundResource(R.drawable.blueblackgradiant); 


    } 
    if (backgroundGrad == 2){ 
     MMBackground.setBackgroundResource(R.drawable.goldblackgradiant); 


    } 

和活動B

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_options_menu); 
    variableHandler(); 
} 

public void variableHandler() { 

    MainMenuBackgroundBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(final View v) { 

      final SharedPreferences[] sharedGradients = {getSharedPreferences("gradientInfo", Context.MODE_PRIVATE)}; 
      final SharedPreferences.Editor[] editor1 = {sharedGradients[0].edit()}; 

      final SharedPreferences[] sharedBoolean = {getSharedPreferences("binaryPoint", Context.MODE_PRIVATE)}; 
      final SharedPreferences.Editor[] editorBinary = {sharedBoolean[0].edit()}; 

      final PopupMenu popup = new PopupMenu(getApplicationContext(), v); 
      popup.inflate(R.menu.menu_background_gradiant_setter); 
      popup.show(); 


      popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
       @Override 
       public boolean onMenuItemClick(MenuItem item) { 

        switch (item.getItemId()) { 
         case R.id.item1: 
          Toast.makeText(OptionsMenu.this, "Blue and black gradient", Toast.LENGTH_SHORT).show(); 

          editorBinary[0] = sharedBoolean[0].edit(); 
          editorBinary[0].putInt("binaryPoint", 1); 

          editor1[0] = sharedGradients[0].edit(); 
          editor1[0].putInt("backgroundGradient", 1); 
          editor1[0].apply(); 



          return true; 

         case R.id.item2: 
          Toast.makeText(OptionsMenu.this, "Gold and black gradient", Toast.LENGTH_SHORT).show(); 
          editorBinary[0] = sharedBoolean[0].edit(); 
          editorBinary[0].putInt("binaryPoint", 1); 

          editor1[0] = sharedGradients[0].edit(); 
          editor1[0].putInt("backgroundGradient", 2); 
          editor1[0].apply(); 
          return true; 
    } 
} 
+0

您不需要重新創建僅用於設置背景的活動,您可以針對Activity B的意圖以及結果設置A的背景執行startActivityForResult。另外,讀取您的代碼並不是真的需要一個活動B,可以在AlertDialog中處理或從活動A提示。 – zgc7009

+0

爲什麼數組中的SharedPreferences? –

回答

1

的問題是,你在活動的onCreate()方法中調用recreate(),而沒有任何會造成無限循環的條件。保留一個變量來跟蹤活動是否被重新創建。

private static boolean alreadyRecreated = false; 
//You can add some extra conditions here if you want. 
if(!alreadyRecreated){ 
    recreate(); 
    alreadyRecreated = true; 
} 
0

recreate();將導致您的活動被重新創建。

即,onCreate被調用。由於您在onCreate方法中添加了recreate();,因此它將運行到無限循環並崩潰。