2017-08-16 276 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