从第二个活动传输数据时出错

时间:2017-06-29 10:17:00

标签: java android

我有2个活动 FirstActivity有1个textView和1个按钮,和 MainActivity有4个复选框,1个textView和1个按钮。 第一个活动是应用向用户展示的第一个活动。

{{3}}

在FirstActivity上,我想检查textView中检查了多少个checbox。 在MainActivity上工作正常,我们可以选择复选框,textView显示检查了多少。 Adittionaly,复选框状态和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
}

}

MainActivity:

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();

}

}

3 个答案:

答案 0 :(得分:1)

这个绝对是错误的。

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
}

然后,您可以使用onCreate

FirstActivity方法加载选中的号码
@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);
    }

答案 1 :(得分:1)

FirstActivity 存储值:

Intent intent = new Intent(getBaseContext(), Activity.class);
intent.putExtra("ID", sessionId);
startActivity(intent);

SecondActivity 获取值:

String s = getIntent().getStringExtra("ID");

答案 2 :(得分:1)

public static final int REQUEST_CODE = 100;

更改FirstActivity.java

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

添加onActivityResult

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

更改MainActivity.java

b2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
               Log.d("TAG","------"+numberOfTrue);
                Intent output = new Intent();
            output.putExtra("number", numberOfTrue);
            setResult(Activity.RESULT_OK, output);
            finish();
            }
        });