Android:如何保存数据(意图的数据)

时间:2016-01-12 05:26:08

标签: java android android-intent android-activity android-studio

有一个示例代码使用Intent在三个Activity代码下面传递数据。

活动A

public class A extends AppCompatActivity {

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

public void onButton1Clicked(View v) {
    Intent intent = new Intent(getApplicationContext(), B.class);
    startActivity(intent);
}

活动B

public class B extends AppCompatActivity {

TextView tv;
ImageButton ib;

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

    tv = (TextView) findViewById(R.id.textView);
    ib = (ImageButton) findViewById(R.id.imageButton);
    ib.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(B.this, C.class);
            startActivityForResult(intent, 2);
        }
    });

}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 2) {
        if (data != null) {
            String message = data.getStringExtra("DATA");
            tv.setText(message);
        }
    }
}

public void onButton2Clicked(View v) {
    Intent intent = new Intent(getApplicationContext(), C.class);
    startActivity(intent);
}

活动C

public class C extends AppCompatActivity {

EditText et;
Button btn;


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

    et = (EditText) findViewById(R.id.editText);
    btn = (Button) findViewById(R.id.button);
    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            String data = et.getText().toString();
            Intent intent = new Intent();
            intent.putExtra("DATA", data);
            setResult(2, intent);
            finish();
        }
    });
}

活动顺序为A - B - C.

在A中,有一个可以移动到B的Button,而在B中有一个Button(可以移动到C)和TextView。在C中,一个Button(可以再次移动到B)和EditText。

例如,使用' startActivityForResult'我有输出作为TextView(B)接收由C中的EditText输入的文本。但是在将B移动到A(后退)之后,当再次进入B时,TextView的插入消失了。另外,即使进入C,也没有插入EditText。

我真的需要并且知道“保存代码”'通过在按下C中的按钮时输入EditText来输入变量。

在这种情况下,我如何添加'Code'仍然是插入值,插入值是通过退出应用程序还是移动到接收DATA的Activity,如A?

感谢您的合作和关注。

2 个答案:

答案 0 :(得分:2)

要维护您的活动状态,您必须覆盖onSaveInstanceState方法。将TextViews和EditText的值存储在此方法中。例如,让我们谈谈活动B.在活动B中你会做这样的事情:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    String text = tv.getText().toString();
    savedInstanceState.putString("mytext", text);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

然后在onCreate执行此操作:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first
   // Set Content View and initialize the views
    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        String mytext = savedInstanceState.getString("mytext");
        tv.setText(mytext);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

您可以阅读有关Recreating an Activity.

的更多信息

答案 1 :(得分:0)

您可以使用以下方式存储意图的数据。 您的示例似乎对如何传递数据感到困惑,并且您在ActivityB中有两个方法来处理Intent。 (onButtonClicked和StartActivityForResult())

这是一个简单的例子

定义唯一字符串以保存您的Intent数据 - ActivityA

public final static String EXTRA_MESSAGE ="myMessage";

下面的方法将打开ShowMessage活动,显示您在EditText视图中输入的消息。

 public void sendMessage(){
 Intent intent = new Intent(this, ShowMessage.class);
    EditText editText = (EditText) findViewById(R.id.edit_message);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
}

以下是您在ShowMessage活动中检索该数据的方法。 -ActivityB。

Intent intent = getIntent();
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
 //EXTRA_MESSAGE is a unique string that holds the message typed in TextView
  TextView receiveMessage = findViewById(R.id.sentMessage);
  receiveMessage.setText(message); //would set the message typed in ActivityA

现在当你回来并且你仍然希望你的EditText输入前一个字符串时,你可以做到Eric B.给出的答案。

//Saving the value
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    String myMessage = editText.getText().toString();
    outState.putString("myMessage", myMessage);

}

在onCreate()中,您可以按如下方式检索

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

   if (savedInstanceState != null){

        String myMessage = savedInstanceState.getString("myMessage","");
        editText.setText(myMessage);
    }

另外,建议使用resultCode == RESULT_OK来验证意图。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (requestCode == 2 && resultCode == RESULT_OK) {
    if (data != null) {
        String message = data.getStringExtra("DATA");
        tv.setText(message);
    }
}