2017-08-16 271 views
-1

所以我創建一個簡單的android應用程序用於教育目的。我有一個菜單項,其中有3個複選框。只要我的應用程序啓動,用戶可以從給定的複選框中選擇一個或多個。但是,我想保存用戶選擇以供進一步參考。我使用共享首選項爲其中的一個複選框實現了這一目標,但如果選中多個複選框,則無法實現此目的。以下是我的代碼:共享首選項存儲

public class MainActivity extends AppCompatActivity { 
    static Switch swch; 
    static TextView onOffBar; 
    public static boolean red = false; 
    public static boolean blue = false; 
    public static boolean green = false; 

    private static final String TAG = "MainActivity"; 

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

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main_menu, menu); 
     SharedPreferences settings = getSharedPreferences("settings", 0); 
     boolean isChecked = settings.getBoolean("checkbox", false); 

     MenuItem item = menu.findItem(R.id.red); 
//  MenuItem item1 = menu.findItem(R.id.blue); 
//  MenuItem item2 = menu.findItem(R.id.green); 
     item.setChecked(isChecked); 
//  item1.setChecked(isChecked); 
//  item2.setChecked(isChecked); 
     //return super.onCreateOptionsMenu(menu); 
     return true; 
    } 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     SharedPreferences settings = getSharedPreferences("settings", 0); 
     SharedPreferences.Editor editor = settings.edit(); 
     switch (item.getItemId()) { 
      case R.id.red: 
       item.setChecked(!item.isChecked()); 

       editor.putBoolean("checkbox", item.isChecked()); 
       editor.commit(); 
       return true; 
      case R.id.blue: 
       item.setChecked(!item.isChecked()); 

       editor.putBoolean("checkbox", item.isChecked()); 
       editor.commit(); 
       return true; 
      case R.id.green: 
       item.setChecked(!item.isChecked()); 

       editor.putBoolean("checkbox", item.isChecked()); 
       editor.commit(); 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

如何使用共享首選項實現所有開關盒選項?

謝謝。

回答

0

如果這不是你的意思,我很抱歉。但基本上你是在正確的軌道上,你只需要輸入一個不同的鍵,爲每個你想保存和檢查的布爾值。此外,最佳做法是對首選項使用更具描述性的關鍵字,而不是使用諸如「複選框」之類的可適用於任何嘗試使用描述符的內容,以便從長遠角度更好地記錄和記住它的作用。

 @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
       SharedPreferences settings = getSharedPreferences("settings", 0); 
       SharedPreferences.Editor editor = settings.edit(); 
     switch (item.getItemId()) { 
      case R.id.red: 
       item.setChecked(!item.isChecked()); 

       editor.putBoolean("red", item.isChecked()); 
       editor.commit(); 
       return true; 
       Case R.id.blue: 
       item.setChecked(!item.isChecked()); 
       Blue1 = item.isChecked(); 
       editor.putBoolean("blue", Blue1); 
       editor.commit(); 
       return true; 
      case R.id.green: 
       item.setChecked(!item.isChecked()); 
       Green1=item.isChecked(); 
       editor.putBoolean("green", Green1); 
       editor.commit(); 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 
+0

@ Devsil ..我試過這個,但當應用程序被殺時,複選框的狀態沒有得到保存。我應該做什麼改變? – Thomas

+0

不完全確定這是什麼情況,也許嘗試用apply() – Devsil

-2

您可以使用Gson來存儲模型對象。

public class CheckboxData { 
    boolean personalize_permissions; 
    boolean add_tanslucent_layer; 
    boolean integrate_flowInfo; 
} 

加入的build.gradle

compile 'com.google.code.gson:gson:2.7' 

下創建CheckboxData的對象,並根據您的複選框選項填充它。

CheckboxData data = new CheckBoxData(); 
data.setPersonalize_permissions(true); 
data.setIntegrate_flowInfo(true); 

Gson gson = new Gson(); 
String json = gson.toJson(data); 
prefsEditor.putString("CheckBoxPrefs", json); 

檢索

Gson gson = new Gson(); 
String json = mPrefs.getString("CheckBoxPrefs", ""); 
CheckboxData prefData = gson.fromJson(json, CheckboxData.class); 

設置選中的複選框按prefData值時。

+0

替換編輯器中的commit()雖然這在技術上是正確的,但對於他/她正在嘗試執行的操作可能完全是矯枉過正。 – Devsil