gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:28:43 24 4
gpt4 key购买 nike

我有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com