【问题标题】:Android : How to save data (Intent's Data)Android:如何保存数据(Intent's Data)
【发布时间】:2016-04-16 15:00:54
【问题描述】:

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

活动 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中有一个Button可以移动到B,B中有一个Button(可以移动到C)和TextView。在 C 中,一个 Button(可以再次移动到 B)和 EditText。

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

当按下 C 中的按钮时,我真的需要并且知道“保存代码”到变量中,方法是输入 EditText。

在这种情况下,我如何添加“代码”以保留插入值,或者通过退出应用程序保留插入值,或者移动到接收到 A 类数据的 Activity?

感谢您的合作和关心。

【问题讨论】:

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


    【解决方案1】:

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

    这是一个简单的例子

    定义唯一的字符串来保存你的 Intent 数据 - 活动A

    public final static String EXTRA_MESSAGE ="myMessage";
    

    以下方法将打开ShowMessage Activity,显示您在 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 活动中检索该数据的方法。 -活动B。

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

    【讨论】:

      【解决方案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.

      【讨论】:

      • 嗯.....我感觉到了。我想再问你一个问题。你能告诉我如何编辑我的代码吗?
      • 如何编辑我的代码?打开您的 Activity 课程,阅读我的回答中提供的指南,然后按照它的要求去做。
      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      相关资源
      最近更新 更多