onResume在启动时导致问题

时间:2012-12-11 21:23:25

标签: android listview onresume activity-lifecycle

我有一项允许用户开始第二项活动的活动。第二个活动有一个项目列表,我将其添加到数组列表中。当我返回上一个活动时,我想显示数组列表的大小。

但是我遇到了onResume()的问题。它是在创建我的第一个活动时调用的,因此在首次启动时数组列表不存在时会生成错误!

的onResume():

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    getIntentData();
    calcSubTotal(orderData);
}

getIntentData():

public void getIntentData(){
    b = new Bundle();
    b = getIntent().getExtras();
    orderData = b.getParcelable("order");
    Toast.makeText(this.getApplicationContext(), orderData.size(), Toast.LENGTH_LONG).show();
}

第二项活动的onCreate():

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_starters);
    createTestData();

    b = new Bundle();
    orderData = new MenuItemList();

    adapter = new MenuItemArrayAdapter(this, starters);
    this.setListAdapter(adapter);
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {

    Toast.makeText(this.getApplicationContext(), l.getItemAtPosition(position).toString() + " clicked", Toast.LENGTH_LONG).show();
    //add clicked item to orderData....
    MenuItem m = (MenuItem)l.getItemAtPosition(position);
    //create new item
    orderData.add(m);   
}

知道如何控制它吗?

ERROR:

  

java.lang.RuntimeException:无法恢复活动{com.example.waitronproto3 / com.example.waitronproto3.SectionsActivity}:java.lang.NullPointerException

3 个答案:

答案 0 :(得分:2)

我想您可能想要查看startActivityForResult,而不是在您开始第二个活动时。它允许您的第二个活动将结果返回到您的第一个活动。您可以在Activity文档中阅读,特别是"开始活动和获得结果"文件的一部分。

编辑:根据你的代码的外观 - 你所做的就是从第二个活动中存储一个包并将其发送回第一个活动。因此,您在第一项活动中永远不会获得正确的Bundle数据。如建议的那样,请查看startActivityForResult以启动您的第二项活动。这样您就可以轻松地将数据返回到第一个活动中。

答案 1 :(得分:0)

  

但是我遇到了onResume()的问题。它是在创建我的第一个活动时调用的,因此在首次启动时数组列表不存在时会生成错误!

我建议更改getIntentData()以检查是否首先存在相应的数据:

public void getIntentData(){
    Intent intent = getIntent();
    if(intent != null && intent.hasExtra("order")) {
        orderData = b.getParcelable("order");
        Toast.makeText(this.getApplicationContext(), orderData.size(), Toast.LENGTH_LONG).show();
        calculateSubTotal(order);
    }
}

并更新onResume()

@Override
protected void onResume() {
    super.onResume();
    getIntentData();
}

(虽然您现在可以简单地将getIntentData()放入onResume()。)

答案 2 :(得分:0)

onResume()将根据Android LifecycleonCreate()之后调用`if(intentData != null) //do something` ,因此在尝试使用之前,您需要检查数据是否为空。

{{1}}