java - 从第二个 Activity 传输数据时出错

标签 java android

我有 2 个 Activity 。
FirstActivity 带有 1 个 textView 和 1 个按钮,以及 MainActivity 带有 4 个复选框、1 个 TextView 和 1 个按钮。 第一个 Activity 是应用向用户显示的第一个 Activity 。

Layouts of my activities

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

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

我应该在这里修复什么以及如何修复?

我在此处粘贴我的 2 个 Activity 的代码:

第一 Activity :

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
}

主要 Activity :

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 的方法。 在 onActivityResult 中写入 SharedPreferences 以确保仅保存“已保存”的检查。

@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
}

然后你可以在 FirstActivityonCreate 方法中载入你选中的号码

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

更新

在这里,您正试图从 onActivityResult 中的 intent 中获取数字。这是错误的,这样您将始终拥有 number = 0(默认值)。 Activity 结果不会将数据填充到 Intent 中。您的所有数据都在方法中传递的 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);
    }

关于java - 从第二个 Activity 传输数据时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44822385/

相关文章:

Android:在警告对话框中格式化字体

Java 和 Spring - 轮询 http 端点,直到服务器完成处理

android - 请求增量注释处理

java - 如果两个复选框的语句被选中问题

java - 代码可以在 Netbeans 中运行,但不能在 TextPad 中运行?

java - 使用compareTo增加应用程序版本名称

android - 我可以使用作业调度程序发送通知吗?

java - Spring JPA 没有将自定义值枚举类型保存到数据库

java - 如何在 Java 上使用 Maven 按顺序运行具有多个 testng 测试的多个类

java - 前向引用不正确的有趣问题