如何等待Android对话框完成



我正在做一个逃跑游戏,我有一个useObjectButton。当点击时,它会显示一个带有ListView的对话框,我希望它在玩家点击对话框中的一个项目后更新信息。然而,它是即时更新的,我不知道如何修复它

我的对话框如下所示:

public Inventory.ITEM selectItem() {
if (game.inventory.isEmpty()) {
Toast.makeText(this, "Inventory is empty", Toast.LENGTH_SHORT).show();
return null;
} else {
AlertDialog inventoryDialog;
AlertDialog.Builder inventoryDialogBuilder = new AlertDialog.Builder(ActivityGame.this);
View inventoryPopup = getLayoutInflater().inflate(R.layout.inventory, null, false);
inventoryDialogBuilder.setView(inventoryPopup);
inventoryDialog = inventoryDialogBuilder.create();
inventoryDialog.setCancelable(true);
ListView lvInventory = inventoryPopup.findViewById(R.id.inventory_lv);
if (!game.inventory.isEmpty()) {
ArrayAdapter adapter = new ArrayAdapter(ActivityGame.this, android.R.layout.simple_list_item_1, game.inventory.getInventory());
lvInventory.setAdapter(adapter);

lvInventory.setOnItemClickListener((parent, view, position, id) -> {
selectedItem = game.inventory.getItem(position);
inventoryDialog.dismiss();    
});    
inventoryDialog.show();
}
}
}

我在各种函数中称之为

btnUseObject.setOnClickListener(v -> {
Inventory.ITEM item=selectItem();
info.setText(game.nightStand.useObject(item));
if(game.nightStand.isUnlocked()) {
btnDrawer1.setEnabled(true);
btnDrawer2.setEnabled(true);
}
});

首先,您必须了解这些指令的异步性质:

Inventory.ITEM item=selectItem();

lvInventory.setOnItemClickListener((parent, view, position, id) -> {
selectedItem = game.inventory.getItem(position);
inventoryDialog.dismiss();    
});

您不能让此方法返回selectedItem的值,因为它在执行时是未知的。将点击监听器绑定到按钮与用户实际点击按钮的动作发生在不同的时刻。您应该做的是将一个函数作为异步函数的参数,当用户单击按钮时,该函数将被调用。类似这样的东西:

public void selectItem(Consumer callbackFn) {
if (game.inventory.isEmpty()) {
Toast.makeText(this, "Inventory is empty", Toast.LENGTH_SHORT).show();
return;
}

AlertDialog inventoryDialog;
AlertDialog.Builder inventoryDialogBuilder = new AlertDialog.Builder(ActivityGame.this);
View inventoryPopup = getLayoutInflater().inflate(R.layout.inventory, null, false);

inventoryDialogBuilder.setView(inventoryPopup);
inventoryDialog = inventoryDialogBuilder.create();
inventoryDialog.setCancelable(true);

ListView lvInventory = inventoryPopup.findViewById(R.id.inventory_lv);
ArrayAdapter adapter = new ArrayAdapter(ActivityGame.this, android.R.layout.simple_list_item_1, game.inventory.getInventory());
lvInventory.setAdapter(adapter);

lvInventory.setOnItemClickListener((parent, view, position, id) -> {
// The asynchronous function that gets called whenever an user clicks a button. 
// You cannot return a value from it because it is not immediately known at execution time.
callbackFn.accept(game.inventory.getItem(position));
inventoryDialog.dismiss();    
});

inventoryDialog.show();
}

然后

btnUseObject.setOnClickListener(v -> {
Consumer callbackFn = (Inventory.ITEM item) -> {
info.setText(game.nightStand.useObject(item));
if (game.nightStand.isUnlocked()) {
btnDrawer1.setEnabled(true);
btnDrawer2.setEnabled(true);
}
};
selectItem(callbackFn); // When an user clicks the button, please execute my callback function
});

最新更新