Android - 如何保存 CheckBox 的状态

3

我有一个含有复选框的应用程序,如何保存它们?

我的布局为:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/list_linear"
android:layout_width="fill_parent" android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
    <ScrollView android:id="@+id/ScrollView01"
 android:layout_width="fill_parent"
 android:layout_height="match_parent">

<TableLayout 
android:id="@+id/tableLayout1" 
android:layout_height="match_parent" 
android:layout_width="wrap_content">
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Ontbijtkoek" android:id="@+id/checkBox1" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Koekrepen" android:id="@+id/checkBox70" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Beschuit" android:id="@+id/checkBox69" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Chocolade" android:id="@+id/checkBox68" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Koekjes" android:id="@+id/checkBox67" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Brood" android:id="@+id/checkBox66" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Hagelslag puur" android:id="@+id/checkBox65" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Hagelslag mix" android:id="@+id/checkBox64" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Pindakaas" android:id="@+id/checkBox63" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Pasta" android:id="@+id/checkBox62" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Jam" android:id="@+id/checkBox61" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Thee" android:id="@+id/checkBox60" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Boter" android:id="@+id/checkBox59" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Smeerkaas" android:id="@+id/checkBox58" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Suiker" android:id="@+id/checkBox57" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Groente" android:id="@+id/checkBox56" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Fruit" android:id="@+id/checkBox55" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Aardappeltjes" android:id="@+id/checkBox54" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Zoutjes" android:id="@+id/checkBox53" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
    <CheckBox android:textSize="30sp" android:background="@drawable/checkbox_background" android:button="@drawable/checkbox" android:text="Sapjes" android:id="@+id/checkBox52" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>     
</TableLayout>
</ScrollView>
</LinearLayout>

是的,我知道有许多复选框

我的主类是:

package com.boodschappen;

import android.app.Activity;
 import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.CheckBox;
import android.widget.TextView;

public class main extends Activity {
    @Override
    public void onBackPressed() {

            showDialog(MENU_EXIT);

            super.onBackPressed();
    }

private static final int MENU_SAVE = 0;
private static final int MENU_DIALOG = 2;
private static final int MENU_EXIT = 3;
private static final int MENU_LOAD = 1;

CheckBox een, v52, v53, v54, v55, v56, v57, v58, v59, z60, z61, z62, z63, z64, z65, z66, z67, z68, z69, z70 ;

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    setContentView(R.layout.list);



    Typeface fontFace = Typeface.createFromAsset(getAssets(), "fonts/ankehand.ttf");

    TextView someText1 = (TextView)findViewById(R.id.checkBox1);
    TextView someText52 = (TextView)findViewById(R.id.checkBox52);
    TextView someText53 = (TextView)findViewById(R.id.checkBox53);
    TextView someText54 = (TextView)findViewById(R.id.checkBox54);
    TextView someText55 = (TextView)findViewById(R.id.checkBox55);
    TextView someText56 = (TextView)findViewById(R.id.checkBox56);
    TextView someText57 = (TextView)findViewById(R.id.checkBox57);
    TextView someText58 = (TextView)findViewById(R.id.checkBox58);
    TextView someText59 = (TextView)findViewById(R.id.checkBox59);
    TextView someText60 = (TextView)findViewById(R.id.checkBox60);
    TextView someText61 = (TextView)findViewById(R.id.checkBox61);
    TextView someText62 = (TextView)findViewById(R.id.checkBox62);
    TextView someText63 = (TextView)findViewById(R.id.checkBox63);
    TextView someText64 = (TextView)findViewById(R.id.checkBox64);
    TextView someText65 = (TextView)findViewById(R.id.checkBox65);
    TextView someText66 = (TextView)findViewById(R.id.checkBox66);
    TextView someText67 = (TextView)findViewById(R.id.checkBox67);
    TextView someText68 = (TextView)findViewById(R.id.checkBox68);
    TextView someText69 = (TextView)findViewById(R.id.checkBox69);
    TextView someText70 = (TextView)findViewById(R.id.checkBox70);

    someText1.setTypeface(fontFace);    // only typeface
    someText52.setTypeface(fontFace);    // only typeface
    someText53.setTypeface(fontFace);    // only typeface
    someText54.setTypeface(fontFace);    // only typeface
    someText55.setTypeface(fontFace);    // only typeface
    someText56.setTypeface(fontFace);    // only typeface
    someText57.setTypeface(fontFace);    // only typeface
    someText58.setTypeface(fontFace);    // only typeface
    someText59.setTypeface(fontFace);    // only typeface
    someText60.setTypeface(fontFace);    // only typeface
    someText61.setTypeface(fontFace);    // only typeface
    someText62.setTypeface(fontFace);    // only typeface
    someText63.setTypeface(fontFace);    // only typeface
    someText64.setTypeface(fontFace);    // only typeface
    someText65.setTypeface(fontFace);    // only typeface
    someText66.setTypeface(fontFace);    // only typeface
    someText67.setTypeface(fontFace);    // only typeface
    someText68.setTypeface(fontFace);    // only typeface
    someText69.setTypeface(fontFace);    // only typeface
    someText70.setTypeface(fontFace);    // only typeface



    een = (CheckBox) findViewById(R.id.checkBox1);
     een.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    een.setTextColor(R.color.black);
                } else {
                    een.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v42 = (CheckBox) findViewById(R.id.checkBox52);
     v42.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v42.setTextColor(R.color.black);
                } else {
                    v42.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v43 = (CheckBox) findViewById(R.id.checkBox53);
     v43.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v43.setTextColor(R.color.black);
                } else {
                    v43.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v44 = (CheckBox) findViewById(R.id.checkBox54);
     v44.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v44.setTextColor(R.color.black);
                } else {
                    v44.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v45 = (CheckBox) findViewById(R.id.checkBox55);
     v45.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v45.setTextColor(R.color.black);
                } else {
                    v45.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v46 = (CheckBox) findViewById(R.id.checkBox56);
     v46.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v46.setTextColor(R.color.black);
                } else {
                    v46.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v47 = (CheckBox) findViewById(R.id.checkBox57);
     v47.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v47.setTextColor(R.color.black);
                } else {
                    v47.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v48 = (CheckBox) findViewById(R.id.checkBox58);
     v48.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v48.setTextColor(R.color.black);
                } else {
                    v48.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v49 = (CheckBox) findViewById(R.id.checkBox59);
     v49.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v49.setTextColor(R.color.black);
                } else {
                    v49.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v50 = (CheckBox) findViewById(R.id.checkBox60);
     v50.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v50.setTextColor(R.color.black);
                } else {
                    v50.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v51 = (CheckBox) findViewById(R.id.checkBox61);
     v51.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v51.setTextColor(R.color.black);
                } else {
                    v51.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v52 = (CheckBox) findViewById(R.id.checkBox62);
     v52.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v52.setTextColor(R.color.black);
                } else {
                    v52.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v53 = (CheckBox) findViewById(R.id.checkBox63);
     v53.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v53.setTextColor(R.color.black);
                } else {
                    v53.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v54 = (CheckBox) findViewById(R.id.checkBox64);
     v54.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v54.setTextColor(R.color.black);
                } else {
                    v54.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v55 = (CheckBox) findViewById(R.id.checkBox65);
     v55.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v55.setTextColor(R.color.black);
                } else {
                    v55.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v56 = (CheckBox) findViewById(R.id.checkBox66);
     v56.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v56.setTextColor(R.color.black);
                } else {
                    v56.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v57 = (CheckBox) findViewById(R.id.checkBox67);
     v57.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v57.setTextColor(R.color.black);
                } else {
                    v57.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v58 = (CheckBox) findViewById(R.id.checkBox68);
     v58.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v58.setTextColor(R.color.black);
                } else {
                    v58.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     v59 = (CheckBox) findViewById(R.id.checkBox69);
     v59.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    v59.setTextColor(R.color.black);
                } else {
                    v59.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
     z60 = (CheckBox) findViewById(R.id.checkBox70);
     z60.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if(((CheckBox) v).isChecked()){
                    z60.setTextColor(R.color.black);
                } else {
                    z60.setTextColor(Color.rgb(255,255,255));
                }
            }
        });
}




@Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(0, MENU_SAVE, 0, "Opslaan");
    menu.add(1,MENU_LOAD, 1, "Laden");
    menu.add(2, MENU_DIALOG, 2, "About");
    menu.add(3, MENU_EXIT, 3, "Exit");
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case MENU_SAVE:
        Here i want to Save the Checkboxes
        return true;
    case MENU_LOAD:
        Here i want to Load the Checkboxes
        return true;
    case MENU_DIALOG:
        Dialog dialog = new Dialog(lidl.this);
        dialog.setContentView(R.layout.custom_dialog);
        dialog.setTitle("About");
        dialog.setCancelable(true);
        //there are a lot of settings, for dialog, check them all out!

        //set up text
        TextView text = (TextView) dialog.findViewById(R.id.text);
        text.setText("Hallo, deze applicatie is een variant op Appie©. Deze applicatie is op volgorde van de winkel waar wij meestal onze boodschappen doen. Wilt u ook zo'n applicatie, ga dan naar het tabje Mail. Zet daarin welke winkel(s) het zijn, en wat u daar altijd koopt.");

        dialog.show();
        return true;
    case MENU_EXIT:
        AlertDialog.Builder alt_bld = new AlertDialog.Builder(this);
        alt_bld.setMessage("Weet je zeker dat je wilt afsluiten?")
        .setCancelable(false)
        .setPositiveButton("Ja", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
        System.exit(0);
        }
        })
        .setNegativeButton("Nee", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
        //  Action for 'NO' Button
        dialog.cancel();
        }
        });
        AlertDialog alert = alt_bld.create();
        // Title for AlertDialog
        alert.setTitle("Exit");
        alert.show();

    return true;
    }
    return false;
}
}

您知道如何做到这一点吗?

我希望您理解我,并希望您能帮助我。

Gaauwe

编辑:

这是我想要保存和加载事物的代码:

@Override
        public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(2, MENU_SAVE, 2, "Save");
        menu.add(3, MENU_LOAD, 3, "Load");
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
    case MENU_SAVE:
        Here save the checkboxes
        return true;
    case MENU_LOAD:
        Here load the checkboxes

    return true;

看看这个链接:http://examples.javacodegeeks.com/android/core/content/android-sharedpreferences-example/ 你需要自己动手尝试一下,只有这样才能学会它。这对我很有帮助。 - Aaron
3个回答

15

你可以考虑使用SharedPreferences来以键值对的形式存储和读取状态和复选框的名称。如何使用。例如,类似于以下内容:

// Init 
SharedPreferences settings = getSharedPreferences("mysettings", 0);
SharedPreferences.Editor editor = settings.edit();

// Save
boolean checkBoxValue = v42.isChecked();        
        editor.putBoolean("v42", checkBoxValue);
        editor.commit();;

// Load
v42.setChecked(settings.getBoolean("v42", false));

但是您应该实现更有效率的方法,可能需要通过循环遍历所有复选框来读取其名称或ID,在离开活动之前调用。


我知道我必须使用SharedPreferences,但是如何使用,这就是我不知道的,你能否提供一个示例或者可以使用的代码? - Gaauwe
所以我的选项是: case MENU_WEEK: SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor editor = prefs.edit(); boolean checkBoxValue = v42.isChecked();
editor.putBoolean("v42", checkBoxValue); editor.commit(); return true; case MENU_LOAD: v42.setChecked(settings.getBoolean("v42", false)); return true; 但是它说:赋值的左侧必须是一个变量。
- Gaauwe
我的错,setChecked()需要一个布尔值作为参数。我已经更正了上面的源代码。另外,你可以初始化设置和编辑器对象一次,并在每个场合使用它们,但我仍然建议你阅读官方参考文档。 - iDroid
我是 Android 的新手,也许您可以告诉我如何在选项菜单中设置保存和加载选项菜单,这样我就可以在我的描述中写下来。 - Gaauwe
你停止帮助我了吗?:'( - Gaauwe

2

重写 onSaveInstanceState(Bundle outState) 方法,并将选中的内容写入 outState 中。然后,您可以通过从传递给 onCreate(Bundle savedInstanceState) 的 savedInstanceState 中提取信息来查看哪些内容已被选中。

例如:

@Override
protected void onSaveInstanceStat(Bundle b){
    b.putBoolean("een",een.isChecked());
    b.putBoolean("v52",v52.isChecked());
    b.putBoolean("v53",v53.isChecked());

    // ... etc
}

@Override
protected void onCreate (Bundle savedInstanceState){
   // everything you have in your onCreate implementation 

   een.setChecked(b.getBoolean("een"));
   v52.setChecked(b.getBoolean("v52"));
   v53.setChecked(b.getBoolean("v53"));

    // ... etc
}

重要提示:不能保证“onSaveInstanceState”方法会被调用。因此,只有在保存UI状态对用户方便而非必要时才使用此方法。如果您不保存数据到用户设备上,例如使用SharedPreference,则用户会更加满意。


现在我必须使用SharedPreferences,但是如何使用,这就是我不知道的,你能否提供一个示例或者代码让我使用? - Gaauwe
我对Android还很陌生,也许您可以告诉我如何在选项菜单中设置“保存”和“加载”选项菜单,这些选项菜单是我在我的描述中编写的吗? - Gaauwe
你停止帮助我了吗?:'( - Gaauwe
在这种情况下,@iDroid方法更为合适。 - Gallal
但我也尝试过那个方法,但那也不起作用。你能否写出我的代码并将iDroid的代码放入其中?希望你能为我做到这一点。 :) - Gaauwe

1

如果你想在不同的会话中存储简单的数据,请查看这里的文档: http://developer.android.com/guide/topics/data/data-storage.html 具体来说,共享首选项布尔存储将起到作用。

在恢复期间,您应该从共享首选项中获取值,并使用它们设置复选框。在暂停期间,您应该从复选框中获取值,并将它们放入共享首选项中。

当我看HeloViews教程时,我也遇到了这个 http://developer.android.com/reference/android/preference/CheckBoxPreference.html

只是一些阅读材料,如果我有时间,可能会给您一些代码示例。 希望这可以帮助到您。


这是HelloViews教程:http://developer.android.com/resources/tutorials/views/hello-formstuff.html#Checkbox - Cooltrooper
我知道这一点,但我已经尝试了很多方法,但我不知道如何获取复选框的共享首选项,如果我有了它,我也不知道如何将其放入我的编辑代码中。所以我的问题是,你能为我编写一个简单的代码吗? - Gaauwe
我正在为您编写一段代码来完成这个任务,但是当使用复选框的setChecked方法时,我一直遇到错误,所以我也有些困惑。不过我会在业余时间继续尝试的。 - Cooltrooper
好的,这也是我所拥有的,也许你可以问一下这个问题,这样更多的人就能看到这个问题了吗?我希望有人能帮助我 :'( - Gaauwe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接