Я думал, что это будет легко, но это ускользает от меня. У меня есть действие, которое отображает настраиваемое диалоговое окно, которое позволяет пользователю вводить некоторый текст, а затем определены кнопки «ОК» и «Отмена». Я отображаю это с помощью show (). Но я не могу понять, как вернуть значение из диалога.
Я использую пользовательский диалог, потому что он выполняет некоторую проверку ввода текста. Думаю, я мог бы изменить его на производное от Activity, а затем отобразить его с помощью startActivityForResult, но - по крайней мере, основываясь на моих старых днях программирования Windows - я думал, что вернуть введенное пользователем значение из диалога Android будет легко.
Я пропускаю какой-то тип обратного вызова или механизм прослушивания?
Я даже попробовал это как простое решение, но оно не позволяло мне присвоить значение (1), если его модификатор не установлен в final, а затем (2), если я скажу «ОК», чтобы сделать его окончательным, не позволит мне присвоить это потому, что «окончательное значение локальной переменной не может быть назначено, так как оно определено в типе включения»
String value;
final EditText input = (EditText)findViewById(R.id.theText);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(input);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int whichButton)
{
value = input.getText().toString();
dialog.dismiss();
}
});
builder.show();
[ПРАВКА обновлена для решения] ============================
Главное, что я закончил, это добавление возможности передавать обработчик в диалог. В диалоговом классе я добавил:
private Handler clientHandler = null;
public void AddHandler(Handler client)
{
this.clientHandler = client;
}
И обновил нажатие кнопки ОК в диалоге:
/**
* The user pressed the OK button
* @param v
*/
public void okClick(View v)
{
// save the entered string
this.tag = this.tagEditText.getText().toString();
if ( null != this.clientHandler )
{
// Notify the client to update itself
this.clientHandler.sendMessage( clientHandler.obtainMessage());
}
cancel();
}
Затем в onCreate () Действия, которое отображает диалог, который я добавил:
tagDialog = new tagDialog(this);
tagHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
tag = tagDialog.tag;
}
};
tagDialog.AddHandler(tagHandler);