【问题标题】:when switching intents I lose data切换意图时我丢失了数据
【发布时间】:2013-03-16 13:21:06
【问题描述】:

当切换意图时,我丢失了前一个 onActivityResult 的数据,我需要它来保留从用户那里获得的两个数字,目前它会保留一个数字,然后当输入下一个时它会丢失前一个,这里是代码:

package com.eric.theworks;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {

Button width, height, calc;
TextView area;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    width = (Button) findViewById(R.id.button1);
    height = (Button) findViewById(R.id.button2);
    calc = (Button) findViewById(R.id.button3);
    area = (TextView) findViewById(R.id.textView1);

    width.setOnClickListener(this);
    height.setOnClickListener(this);
    calc.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent i = new Intent(this, Numbers.class);
    switch (v.getId()) {

    case R.id.button1:
        // width
        i.putExtra("numbers", "width");
        startActivityForResult(i, 1);

        break;

    case R.id.button2:
        // height
        i.putExtra("numbers", "height");
        startActivityForResult(i, 1);

        break;

    case R.id.button3:
        // calc

        break;

    }


    }

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if (data.getExtras().containsKey("widthInfo")){
        width.setText(data.getStringExtra("widthInfo"));

}
    if (data.getExtras().containsKey("heightInfo")){
        height.setText(data.getStringExtra("heightInfo"));

}

}

}





package com.eric.theworks;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class Numbers extends Activity implements OnClickListener {
EditText number;
Button sendInfo;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.numbers);
    number = (EditText) findViewById(R.id.editText1);
    sendInfo = (Button) findViewById(R.id.button1);
    sendInfo.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    String s = number.getText().toString();
    Intent i = getIntent();
    String msg = i.getStringExtra("numbers");
    if (msg.contentEquals("width")) {
        i.putExtra("widthInfo", s);
        setResult(RESULT_OK, i);
        finish();

    }
    if (msg.contentEquals("height")) {
        i.putExtra("heightInfo", s);
        setResult(RESULT_OK, i);
        finish();

    }

    }

}

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    您可以使用静态变量来存储以前的数据。

    全局声明静态字符串。

    static String widthInfo="";
    static String heightInfo="";
    

    同时给出不同的Requestcode。

    case R.id.button1:
            // width
            i.putExtra("numbers", "width");
            startActivityForResult(i, 1);
    
            break;
    
        case R.id.button2:
            // height
            i.putExtra("numbers", "height");
            startActivityForResult(i, 2);
    

    然后在你的 onActivityResult 中使用它。

     @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            // TODO Auto-generated method stub
            super.onActivityResult(requestCode, resultCode, data);
             switch (requestCode) {
            case (1): {
    
            if (data.getExtras().containsKey("widthInfo")){
                widthInfo=data.getStringExtra("widthInfo")
                width.setText(data.getStringExtra("widthInfo"));
    
        } else {
        height.setText(heightInfo);
        width.setText(widthInfo);
        }
            }
       break;
           case (2): 
            {
            if (data.getExtras().containsKey("heightInfo")){
                heightInfo=data.getStringExtra("heightInfo")
                height.setText(data.getStringExtra("heightInfo"));
    
        }else {
        height.setText(heightInfo);
        width.setText(widthInfo);
        }
    
        }
       break;
        }
    }
    

    【讨论】:

    • 此方法确实有效,但由于某种原因,它消除了按钮 2 上的文本并将其变为空白(仍然可以使用),截至目前,他们只是说“按钮”,但这最终会改变。
    • 你可以做一件事。将 resultCode 不同的宽度设置为 1,高度设置为 2,然后在 activityResult 中根据 resultCode 将上述代码分开。 switch(ResultCode){case 1: {// 宽度中断代码;} case 2: { // 高度代码。打破;}}
    • 同样的问题....这很奇怪,因为教程我看到家伙以原始方式对其进行编码,并展示了自己运行它和一切,它运行良好。此处链接:youtube.com/watch?v=03uml_haPH0&list=SP667C75EE599C22C6
    • 好吧,很奇怪,该程序可以在 avd 上运行,但不能在我的实际设备上运行,哈哈?
    • 无论如何,您编辑的版本有什么不同,也许我错过了什么?我试过 ="";
    【解决方案2】:

    您可以使用 Bundle 将数据从一个活动传递到另一个活动,而不是直接传递意图。例如:

     Bundle b = new Bundle();
            b.putString("SingleClick",a );
            b.putString("LongClick", "no");
            i.putExtras(b);
    

    并在另一个活动中获取数据使用

    Bundle bundle = getIntent().getExtras();
            String admin = bundle.getString("LongClick");
    

    【讨论】:

      【解决方案3】:
      String s = number.getText().toString();
      Intent i = getIntent();
      String msg = i.getStringExtra("numbers");
      if (msg.contentEquals("width")) {
          i.putExtra("widthInfo", s);
          setResult(RESULT_OK, i);
          finish();
      
      }
      

      确保字符串 s 有任何值....

      【讨论】:

      • 什么意思?它从 .Numbers 中的编辑字段中获取文本。它确实有效并返回了字符串,但问题是当我更改 heightInfo 时,widthInfo 只是回到说“按钮”,我需要保留两个字符串。
      猜你喜欢
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多