我正在制作标签式布局。在第二个选项卡上,它维护一个项目列表。如果我从第一个选项卡上的另一个列表中删除一个项目,它应该通过调用静态添加方法将其添加到第二个列表。如果我在应用程序第一次启动时执行此操作,它会给我一个空指针异常,因为数据库变量尚未在第二个选项卡上驻留的活动中初始化(使用调试器检查)(尚未调用onCreate方法)。但是,如果我启动应用程序,切换到选项卡,然后切换回第一个选项卡并删除一个项目,它正常工作,因为然后调用onCreate方法。所以我的问题是,在我调用静态方法添加到数据库之前,如何确保我的数据库被实例化,或者我的第二个活动/选项卡中的onCreate?
以下是调用静态方法的代码
ShoppingListActivity.addToShoppingList(name, quan);
这是静态方法
public static void addToShoppingList(String name, int quan)
{
shoppingDb.insertFood(name, quan);
}
它是未被初始化的shoppingDb变量,并且因为尚未调用onCreate而返回null。
答案 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));
}
}