我有2个活动。
FirstActivity,带有1个textView和1个按钮,以及
MainActivity,带有4个复选框,1个textView和1个按钮。
首次活动是应用显示给用户的首次活动。

Layouts of my activities

在FirstActivity上,我想检查在textView中检查了多少个复选框。
在MainActivity上一切正常,我们可以选择复选框,并且textView显示已选中的数量。将复选框的状态和textView的状态保存到SharedPreference中。

现在,我描述我的问题,我不知道如何在启动后在我的应用程序中显示当前第一个活动中的复选框数量。
我尝试使用onActivityResult,但是我认为我做错了,而且我的具有双重意图的button2也一定是错误的。

我在这里应该解决什么以及如何解决?

我在这里粘贴我的2个活动的代码:

FirstActivity:

public class FirstActivity extends AppCompatActivity {

private static final String SHARED_PREFS_NAME = "abc";
private Button b1;
private TextView tv2;
private int number;
public static final int REQUEST_CODE = 100;

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

    b1 = (Button)findViewById(R.id.b1);
    tv2 = (TextView)findViewById(R.id.tv2) ;

    b1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            Intent intent = new Intent(FirstActivity.this, MainActivity.class);
            startActivityForResult(intent, REQUEST_CODE);
        }
    });

    SharedPreferences preferences = getSharedPreferences(SHARED_PREFS_NAME, MODE_PRIVATE);
    number = preferences.getInt("NUMBER", 0);
    tv2.setText(""+number);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        if (requestCode == REQUEST_CODE) {
            int number = data.getExtras().getInt("number");
            tv2.setText(""+number);

            number = getIntent().getExtras().getInt("number");
            saveNumberToSharedPrefs(number);

        }
    }
}

private void saveNumberToSharedPrefs(int num){
    SharedPreferences preferences = getSharedPreferences(SHARED_PREFS_NAME, MODE_PRIVATE); //Create and store this instance in onCreate method of activity, or use it like this.
    preferences.edit().putInt("NUMBER", num).apply(); // Use constant value for key
}


}

主要活动 :

public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {

private int numberOfTrue;
private TextView tv1;
private CheckBox cb1;


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

    CheckBox cb2,cb3,cb4;
    Button b2;

    b2 = (Button)findViewById(R.id.b2);

    tv1 = (TextView)findViewById(R.id.tv1);
    cb1 = (CheckBox)findViewById(R.id.cb1);
    cb1.setChecked(getFromSP("cb1"));
    cb1.setOnCheckedChangeListener(this);
    cb2 = (CheckBox)findViewById(R.id.cb2);
    cb2.setChecked(getFromSP("cb2"));
    cb2.setOnCheckedChangeListener(this);
    cb3 = (CheckBox)findViewById(R.id.cb3);
    cb3.setChecked(getFromSP("cb3"));
    cb3.setOnCheckedChangeListener(this);
    cb4 = (CheckBox)findViewById(R.id.cb4);
    cb4.setChecked(getFromSP("cb4"));
    cb4.setOnCheckedChangeListener(this);

    loadVariable();

    b2.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {

        Intent output = new Intent();
        output.putExtra("number", numberOfTrue);
        setResult(Activity.RESULT_OK, output);
        finish();

        }
    });

}

private boolean getFromSP(String key){
    SharedPreferences preferences = getApplicationContext().getSharedPreferences("PROJECT_NAME", android.content.Context.MODE_PRIVATE);
    return preferences.getBoolean(key, false);
}
private void saveInSp(String key,boolean value) {
    SharedPreferences preferences = getApplicationContext().getSharedPreferences("PROJECT_NAME", android.content.Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putBoolean(key, value);
    editor.commit();
}

private void saveVariable(int numberOfTrue){

    SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putInt("key2", numberOfTrue);
    editor.commit();

}

private void loadVariable(){

    SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
    int number = sharedPref.getInt("key2", 0);
    tv1.setText(""+number);
    numberOfTrue=number;

}

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

    switch(buttonView.getId()){
        case R.id.cb1:
            saveInSp("cb1",isChecked);
            if (isChecked == true){
                numberOfTrue++;

            }
            else
            {
                numberOfTrue--;

            }
            break;
        case R.id.cb2:
            saveInSp("cb2",isChecked);
            if (isChecked == true){
                numberOfTrue++;

            }
            else
            {
                numberOfTrue--;

            }
            break;

        case R.id.cb3:
            saveInSp("cb3",isChecked);
            if (isChecked == true){
                numberOfTrue++;

            }
            else
            {
                numberOfTrue--;

            }
            break;

        case R.id.cb4:
            saveInSp("cb4",isChecked);
            if (isChecked == true){
                numberOfTrue++;

            }
            else
            {
                numberOfTrue--;

            }
            break;

    }

    saveVariable(numberOfTrue);
    loadVariable();

}


}

最佳答案

这绝对是错误的。

Intent intent = new Intent(MainActivity.this, FirstActivity.class);
intent.putExtra("number", numberOfTrue);
startActivityForResult(intent,1);

Intent output = new Intent();
output.putExtra("number", numberOfTrue);
setResult(Activity.RESULT_OK, output);
finish();


您只需要保留第二部分代码。像这样:

Intent output = new Intent();
output.putExtra("number", numberOfTrue);
setResult(Activity.RESULT_OK, output);
finish();


然后像这样启动MainActivity

Intent intent = new Intent(FirstActivity.this, MainActivity.class);
startActivityForResult(intent, REQUEST_CODE); // This change is important.


然后执行以下操作:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK && data != null) {

         number = getIntent().getExtras().getInt("number");

    }
}


这样,当MainActivity关闭时,您会收到它的号码。但是,如果要在FirstActivity开始时读取此值(不转到MainActivity,则需要将选中的数字存储在共享首选项中,然后在onCreate()FirstActivity方法中获取值。
写入SharedPreferences中的onActivityResult以确保仅保存“已保存”支票。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK && data != null) {

         number = getIntent().getExtras().getInt("number");
         saveNumberToSharedPrefs(number);
    }
}

private void saveNumberToSharedPrefs(int num){
    SharedPreferences preferences = getSharedPreferences(SHARED_PREFS_NAME, MODE_PRIVATE); //Create and store this instance in onCreate method of activity, or use it like this.
    preferences.edit().putInt("NUMBER", num).apply(); // Use constant value for key
}


然后,您可以在onCreateFirstActivity方法中加载已检查的号码

@Override
protected void onCreate(Bundle savedInstanceState) {
....
SharedPreferences preferences = getSharedPreferences(SHARED_PREFS_NAME, MODE_PRIVATE);
number = preferences.getInt("NUMBER", 0);
}


更新资料

在这里,您尝试从onActivityResult的意图中获取数字。错了,这样您将始终拥有数字= 0(默认值)。活动结果不会将数据填充到意图中。您的所有数据都在方法中传递的data变量中。

number = getIntent().getExtras().getInt("number");
saveNumberToSharedPrefs(number);


您只需要离开:

   if (requestCode == REQUEST_CODE) { //also you need to check if result is RESULT_OK
        number = data.getExtras().getInt("number");
        tv2.setText(""+number);
        saveNumberToSharedPrefs(number);
    }

10-08 16:06