使用Intents和setResult()在活动之间传递数据时遇到问题

时间:2010-09-04 20:43:41

标签: android

我无法将数据从一个活动传递到另一个活动。

我可以轻松地使用startActivityForResult()来发送原始数据的intent,然后在新的Activity中操作这些数据。然后我在这个新Activity的onPause()函数中使用setResult()来返回Intent对象中的一些数据。这样做会调用原始Activity中的onActivityResult(),但发送给此函数的Intent总是为null,这是错误的。我不明白为什么这个Intent对象为null。

以下是启动Activity的主要功能“Test”:

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

    setContentView(R.layout.main);

    // add some data to play with
    string_array_list.add("item1");
    string_array_list.add("item2");
    string_array_list.add("item3");

    Button start_button = (Button) findViewById(R.id.button);
    start_button.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            // start an activity to reverse the order of items in the list
            startFlip();
        }
    });       
}

private void startFlip() {
    // using a bundle isn't absolutely necessary, 
    // but useful in the real program
    Intent i = new Intent(this, Flip.class);
    Bundle extras = new Bundle();
    extras.putStringArrayList(STRING_ARRAY_LIST, string_array_list);
    i.putExtras(extras);

    startActivityForResult(i, FLIP_REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    string_array_list.clear();
    switch(requestCode) {
        case FLIP_REQUEST_CODE: 
            if(data != null) { // RIGHT ANSWER
                Bundle extras = data.getExtras();
                string_array_list = extras.getStringArrayList(STRING_ARRAY_LIST);
            }

              // WRONG ANSWER, but the only answer I get
            else Log.d(TAG, "data is null"); 
    }   
}

以下是已启动活动的主要功能,“翻转”:

@Override
public void onCreate(Bundle joy) {
    super.onCreate(joy);

    // retrieve the data from intent (or bundle)
    Intent i = getIntent();
    Bundle extras = i.getExtras();
    if(joy != null) oldList = joy.getStringArrayList(Test.STRING_ARRAY_LIST);
    else oldList = extras.getStringArrayList(Test.STRING_ARRAY_LIST);

    // reverse the list order
    for(int x = oldList.size() - 1; x >= 0; --x) 
        newList.add(oldList.get(x));
}

@Override 
public void onPause() {
    super.onPause();

    Intent data = new Intent(this, Test.class);
    Bundle extras = new Bundle();
    extras.putStringArrayList(Test.STRING_ARRAY_LIST, newList);
    data.putExtras(extras);

    setResult(Test.FLIP_REQUEST_CODE, data);
}

1 个答案:

答案 0 :(得分:4)

  

然后我在这个新Activity的onPause()函数中使用setResult()来返回Intent中的一些数据   宾语。这样做会调用原始Activity中的onActivityResult(),但是Intent会发送给这个函数   总是以null结束,这是错误的。我不明白为什么这个Intent对象为null。

onPause()为时已晚。您应该根据一些积极的用户操作(单击列表项,单击按钮等)来调用setResult(),通常后跟finish()

另外,请检查resultCode以确定您是否确实得到了结果。现在,你忽略了它,这会导致你的应用程序因为用户按下BACK按钮而“失败”。