【问题标题】:unable to get data in onActivityResult()无法在 onActivityResult() 中获取数据
【发布时间】:2013-07-02 04:29:09
【问题描述】:

我从Activity 获取一些值,并在onActivityResult() 中获取这些值,调用onActivityResult(),但收到的数据是null CODEMainActivity

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    // TODO Auto-generated method stub

    if(item.getItemId() == R.id.action_settings){
        Intent intent = new Intent(MainActivity.this, AddDetailActivity.class);
        startActivityForResult(intent, request_code);
    }
    return true;
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == request_code){
        if(resultCode == RESULT_OK){

            String name = data.getExtras().getString(AddDetailActivity.NAME_KEY);
            String address = data.getExtras().getString(AddDetailActivity.ADDRESS_KEY);

            Toast.makeText(MainActivity.this, "Name is : " + name + " Address : " + address, Toast.LENGTH_LONG).show();

                        }
    }
}

这是第二个Activity,我从中得到这样的数据:

public class AddDetailActivity extends Activity {

public static final String NAME_KEY = "U-name";
public static final String ADDRESS_KEY = "add";

protected EditText name_et, address_et;
protected String put_name, put_address;
protected Button button = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_detail);

    name_et = (EditText) this.findViewById(R.id.name_editText);
    address_et = (EditText) this.findViewById(R.id.address_editText);

    put_name = name_et.getText().toString();
    put_address = address_et.getText().toString();
    //put_type = null;

    button = (Button) findViewById(R.id.add_button);
    button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Intent intent = new Intent();

            intent.putExtra(NAME_KEY, put_name);
            intent.putExtra(ADDRESS_KEY, put_address);
            setResult(RESULT_OK, intent);

            finish();
        }
    });
}}

如何解决这个问题,谢谢

【问题讨论】:

  • 代替这个String name = data.getExtras().getString(AddDetailActivity.NAME_KEY)试试这个String name = data.getExtras().getString(U-name)
  • @Raghunandan 我也试过了,结果还是null
  • 我建议在 AddDetailActivity.onClick() 周围放置一个断点或添加一些日志记录,并确认您正在放入合理的数据。
  • 您在 add_button 单击之外获得了 EditText 值。在 add_button click 中获取此值。
  • 糟糕!那是我的错误,现在我完成了,感谢您的帮助!

标签: android


【解决方案1】:

只需更改AddDetailActivity.java

这应该在onClick方法里面

put_name = name_et.getText().toString();
put_address = address_et.getText().toString();

你的点击方法应该是这样的

button.setOnClickListener(new View.OnClickListener() {

        @Override
           public void onClick(View arg0) {
            // TODO Auto-generated method stub

            put_name = name_et.getText().toString();
            put_address = address_et.getText().toString();
            // put_type = null;

            Intent intent = new Intent();

            intent.putExtra(NAME_KEY, put_name);
            intent.putExtra(ADDRESS_KEY, put_address);
            setResult(RESULT_OK, intent);

            finish();
        }
    });

【讨论】:

  • 太棒了,即使盯着问题看了几分钟,我也无法追踪它。
  • @WandMaker 我认为这在开发过程中经常发生,逻辑是OK,但结果是NULL ;-)
【解决方案2】:

将您的获取代码移动到按钮点击内

 button = (Button) findViewById(R.id.add_button);
    button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            put_name = name_et.getText().toString();
            put_address = address_et.getText().toString();
            Intent intent = new Intent();

            intent.putExtra(NAME_KEY, put_name);
            intent.putExtra(ADDRESS_KEY, put_address);
            setResult(RESULT_OK, intent);

            finish();
        }
    });

同样在您的onActivityResult 中进行以下更改

    String name = data.getExtras().getString("U-name");
    String address = data.getExtras().getString("add");

【讨论】:

    【解决方案3】:

    Public static variables and Android activity life cycle management

    请参考这里,当活动 B 完成时,您正在使用该活动的静态变量。

    所以 AddDetailActivity.NAME_KEY 将不可用,而是这样做

     @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == request_code){
            if(resultCode == RESULT_OK){
    
                String name = data.getExtras().getString("U-name");
                String address = data.getExtras().getString("add");
    
                Toast.makeText(MainActivity.this, "Name is : " + name + " Address : " + address, Toast.LENGTH_LONG).show();
    
                            }
        }
    

    【讨论】:

    • 亲爱的!很抱歉这么说,但在我的情况下,静态验证仍然适用于我,再见,谢谢你的建议。
    • @ArshadAliSoomro 在这种情况下使用静态变量并不好,因为您调用了完成,您应该让 gc 释放内存,因此在这种情况下静态变量引用可能被垃圾收集的活动。
    • @Raghunandan 我同意,但我已经将这些用于KEY,以便我可以通过KEY 获得正确的值,正如你所说,我也知道这是垃圾收集。
    猜你喜欢
    • 2014-04-07
    • 2017-02-10
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多