Android选项卡式布局空指针,除非我先查看选项卡

时间:2013-10-08 18:34:01

标签: android

我正在制作标签式布局。在第二个选项卡上,它维护一个项目列表。如果我从第一个选项卡上的另一个列表中删除一个项目,它应该通过调用静态添加方法将其添加到第二个列表。如果我在应用程序第一次启动时执行此操作,它会给我一个空指针异常,因为数据库变量尚未在第二个选项卡上驻留的活动中初始化(使用调试器检查)(尚未调用onCreate方法)。但是,如果我启动应用程序,切换到选项卡,然后切换回第一个选项卡并删除一个项目,它正常工作,因为然后调用onCreate方法。所以我的问题是,在我调用静态方法添加到数据库之前,如何确保我的数据库被实例化,或者我的第二个活动/选项卡中的onCreate?

以下是调用静态方法的代码

ShoppingListActivity.addToShoppingList(name, quan);

这是静态方法

public static void addToShoppingList(String name, int quan)
{   
    shoppingDb.insertFood(name, quan);
}

它是未被初始化的shoppingDb变量,并且因为尚未调用onCreate而返回null。

1 个答案:

答案 0 :(得分:0)

由于您使用的是静态方法,因此为什么不在第二个选项卡中使用静态布尔变量,在应用程序启动时为false,而在调用OnCreate方法时为true。然后,您将能够在addToShoppingList方法中测试活动的准备情况。 但是为了使用它,你必须存储数据库初始化之前的数据。

像这样:

class ShopItemData{
    public String name;
    public int quan;
    public ShopItemData(String n, int q){
         name = n;
         quan = q;
    }
}

private static ArrayList<ShopItemData> shopItems = new ArrayList<ShopItemData>();
private static boolean isDBInitialized = false;


@Override
public void onCreate(Bundle savedInstanceState) {
     ...
     //initialize your database
     isDBInitialized = true;
}

...

public static void addToShoppingList(String name, int quan)
{   
    if (isDBInitialized){
        if (shopItems.size() > 0){
            for(ShopItemData item:shopItems){
                shoppingDb.insertFood(item.name,item.quan);
            }
            shopItems.clear();
        }
        shoppingDb.insertFood(name, quan);
    }else{ 
        shopItems.add(new ShopItemData(name,quan));
    }
}