Android 如何使用共享首选项保存有关多个复选框的数据?

Android 如何使用共享首选项保存有关多个复选框的数据?,android,checkbox,sharedpreferences,android-checkbox,checkboxpreference,Android,Checkbox,Sharedpreferences,Android Checkbox,Checkboxpreference,我正在制作一个应用程序,我需要存储60个复选框的数据。 当用户按下提交按钮时,将读取数据。我想在应用程序重新启动时显示用户选择 我试图使用共享的首选项来实现这一点,但不知道我在哪里犯了错误 Y代码如下: import java.util.ArrayList; import java.util.Calendar; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingInten

我正在制作一个应用程序,我需要存储60个复选框的数据。 当用户按下提交按钮时,将读取数据。我想在应用程序重新启动时显示用户选择

我试图使用共享的首选项来实现这一点,但不知道我在哪里犯了错误

Y代码如下:

import java.util.ArrayList;
import java.util.Calendar;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent; 
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Toast;

public class Labs extends Activity implements OnClickListener {

ArrayList <Calendar> Cal= new ArrayList <Calendar>(60);

ArrayList <CheckBox> l= new ArrayList <CheckBox>(60);

ArrayList <Boolean> checkboxValue = new ArrayList <Boolean>(60);

private SharedPreferences mSharedPreferences;
private SharedPreferences.Editor mPrefsEditor;
private Button submitButton;



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


    submitButton = (Button)findViewById(R.id.button1);
    submitButton.setOnClickListener(this);
    mSharedPreferences = getSharedPreferences("loginPrefs", MODE_PRIVATE);
    mPrefsEditor = mSharedPreferences.edit();


    //Initialise check boxes for every slot
    for (int i = 101; i <= 160; i++) {
           String viewId = "checkBox" + i;
           l.add(i-101, (CheckBox) findViewById(getResources().getIdentifier(viewId, "id", getPackageName())));
           checkboxValue.add(i-101, mSharedPreferences.getBoolean("saveLogin", false));
        }   



    for(int j=0; j<60; j++)
    {
    if (checkboxValue.get(j) == true) {
       l.get(j).setChecked(true);}
   }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}   

public void addenable(){

}

public int Day(int a)
{
    int d=0;
    int x = a;
    x--;

    if(x>=30)
        d = (x/6)-3;

    else
        d=(x/6)+2;

    return d;
}

public int Hour(int a)
{
    int hr=0;
    int x=a;

    x--;

    hr=(x%6)+8;

    if((x%6)>=4)
        hr--;

    if(x>=30)
        hr = hr+6;

    return hr;

}

public int Min(int a)
{
    int m=0;
    int x=a;

    if(x%6==5)
        m=50;

    if(x%6==0)
        m=40;

    return m;
}

public void getdata(View V){

    for( int i=0; i<60; i++)
    {
        Cal.add(i, Calendar.getInstance());
        Cal.get(i).set(Calendar.DAY_OF_WEEK, Day(i+1));
        Cal.get(i).set(Calendar.HOUR_OF_DAY, Hour(i+1));
        Cal.get(i).set(Calendar.MINUTE, Min(i+1));
        Cal.get(i).set(Calendar.SECOND, 0);
    }


    //Intents
    Intent setVibration = new Intent();
    setVibration.setClass(this, AlarmReciever.class);

    Intent setNormal = new Intent();
    setNormal.setClass(this, RingerMode.class);

    //PENDING INTENTS
    ArrayList <PendingIntent> Lab_V= new ArrayList <PendingIntent>(60);
    ArrayList <PendingIntent> Lab_N= new ArrayList <PendingIntent>(60);

    for(int i=0; i<60; i++)
    {
        Lab_V.add(PendingIntent.getBroadcast(this, i, setVibration,
                PendingIntent.FLAG_UPDATE_CURRENT));
        Lab_N.add(PendingIntent.getBroadcast(this, i, setNormal,
                PendingIntent.FLAG_UPDATE_CURRENT));
    }

    // create the object
    AlarmManager mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    for(int i=0; i<60; i++)
    {
            if(l.get(i).isChecked()){

             mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, Cal.get(i).getTimeInMillis(), 7*24*60*60*1000, Lab_V.get(i));
             mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, Cal.get(i).getTimeInMillis()+50*60*1000, 7*24*60*60*1000, Lab_N.get(i));

             Toast.makeText(this, "L"+(i+1), Toast.LENGTH_SHORT).show();
            }
    }

    }


public void onClick(View view) {
    if (view == submitButton) {


       for(int i=0; i<60; i++)
       {

        if (l.get(i).isChecked()) {
            mPrefsEditor.putBoolean("checkboxValue" , true);
            mPrefsEditor.commit();
        } else {
            mPrefsEditor.clear();
            mPrefsEditor.commit();
        }
       }

        getdata(view);
    }
}
}
import java.util.ArrayList;
导入java.util.Calendar;
导入android.app.Activity;
导入android.app.AlarmManager;
导入android.app.pendingent;
导入android.content.Context;
导入android.content.Intent;
导入android.content.SharedReferences;
导入android.os.Bundle;
导入android.view.Menu;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.widget.Button;
导入android.widget.CheckBox;
导入android.widget.Toast;
公共类实验室扩展了活动实现OnClickListener{
ArrayList Cal=新的ArrayList(60);
ArrayList l=新的ArrayList(60);
ArrayList checkboxValue=新的ArrayList(60);
私人共享参考mSharedPreferences;
私人共享参考。编辑mPrefsEditor;
私人按钮提交按钮;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_labs);
可加();
submitButton=(按钮)findViewById(R.id.button1);
submitButton.setOnClickListener(此);
mSharedPreferences=getSharedReferences(“loginPrefs”,MODE\u PRIVATE);
mPrefsEditor=mSharedPreferences.edit();
//初始化每个插槽的复选框
对于(int i=101;i=4)
人力资源--;
如果(x>=30)
hr=hr+6;
返回人力资源;
}
公共整数最小值(整数a)
{
int m=0;
int x=a;
如果(x%6==5)
m=50;
如果(x%6==0)
m=40;
返回m;
}
公共数据(视图V){

对于(int i=0;i,看起来您在onClick()方法中不断地将相同的SharedReference“checkboxValue”设置为true

我也不清楚onClick方法中的逻辑是什么,因为看起来如果其中任何一个没有被检查,您只是在清除整个SharedReferences文件

我建议:

  • 在共享首选项中唯一地命名每个复选框
  • 删除mPrefEditor.clear(),因为您只是清除整个文件,而不是一行(除非您希望这样做)

    public void onClick(视图){
    ...
    对于(int i=0;i<60;i++){
    if(l.get(i).isChecked()){
    mPrefEditor.putBoolean(“复选框_”+i,true);
    }
    否则{
    mPrefEditor.putBoolean(“复选框+i,false);
    }
    }
    提交();
    ...
    }
    

  • 你当前的代码有什么问题?你没有说什么不起作用的东西(是崩溃,只是没有保存,等等)。不,伙计,它只是没有保存任何东西。有什么进展吗?如果有,请标记一个正确的答案或问一个后续问题。这似乎也是我的问题。我认为你的建议可以解决问题。
    public void onClick(View view) {
        ...
        for(int i = 0; i < 60 ; i++){
    
            if(l.get(i).isChecked()){
                mPrefEditor.putBoolean("checkBox_"+i, true);
            }
            else {
                mPrefEditor.putBoolean("checkBox_"+i, false);
            }
        }
        mPrefEditor.commit();
        ...
    }