Как сделать обычный диалог с кнопкой "ОК" чтобы пока не нажал, код за ним не выполнялся?
на других платформах это просто:
private void init(){
//init code here...
if (isSomethingWhrong()){
msgbox("wrong stuff will be fixed");
//do fix wrong stuff here...
}
if (isAnotherthingWrong()){
msgbox("more wrong stuff will be fixed");
//do fix more wrong stuff....
}
//continue init code here...
}
В андроиде пока я ничего подобного и простого не нашел. В качестве диалога есть AlertDialog. Но он не блокирует выполнение кода.
Например моя функция msgbox:
private void msgbox(String msg){
new AlertDialog.Builder(activity)
.setTitle("Test")
.setMessage(msg)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {}
})
.setNegativeButton("", null)
.show();
}
..естественно не работает как надо, код идет дальше и на экране юзер видит первым "more wrong stuff will be fixed" а потом "wrong stuff will be fixed", причем когда уже все пофикшено.
Ужасно кривое решение здесь конечно бы было что-то типа:
private void init(){
//init code here...
handleWrongStuff();
}
private void handleWrongStuff(){
if (isSomethingWhrong()){
new AlertDialog.Builder(activity)
.setTitle("Test")
.setMessage("wrong stuff will be fixed")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//do fix wrong stuff here...
handleMoreWrongStuff();
}
})
.setNegativeButton("", null)
.show();
}
else{
handleMoreWrongStuff();
}
}
private void handleMoreWrongStuff(){
if (isAnotherthingWrong()){
new AlertDialog.Builder(activity)
.setTitle("Test")
.setMessage("more wrong stuff will be fixed")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//do fix more wrong stuff here...
continueInit();
}
})
.setNegativeButton("", null)
.show();
}
else{
continueInit();
}
}
private void continueInit(){
//continue init code here...
}
Но это по-моему просто ужас на костылях. Во-первых код диалога повторяется, во-вторых код инициализации разбивается на части не по логическому принципу а там где попался диалог. На примере еще сойдет, но будет совершенно нечитабельным в промышленном применении.
Как реализовать функцию msgbox чтобы она блокировала выполнение кода и не надо бы было переписывать инициализацию диалога кучу раз? Возможно ли такое на андроиде. (..и на яве вообще?)
Здравствуйте, 8bit, Вы писали:
8>Здравствуйте, kompotFX, Вы писали:
8>в андройде диалоги асинхронны. ui поток блокировать нельзя.
8>но сделать то что вам надо можно, если код init() будет выполнятся в отдельном потоке.
да я уже с печалью понял, что асинхронные
и да, можно сделать и в том же потоке (я там привел вариант), но это же ужос как некрасиво выглядит.
А если дальше-больше, например мне надо что-то типа:
void foo(){
object = getDeafultObject();
if (!object)
object = giveMeSomethingDependingOnUserChoice();
doFoo(object);
}
ObjectX giveMeSomethingDependingOnUserChoice(){
if ( messageBoxYesNo("Do you want objectA?") )
return getObjectA();
else
return getObjectB();
}
ну проще некуда на любой другой платформе. В андроиде же я должен резать foo на части ради простенького выбора юзера. Извращение.