Как я могу получить результаты из AlertDialog?
Я использую AlertDialog.Builder для отображения диалогового окна, предлагающего пользователю ввести пароль, поэтому я хочу сохранить этот пароль в предпочтении, однако я не могу понять, как получить результат из диалогового окна предупреждения метод ввода.
Вот что я хотел бы сделать:
String result;
AlertDialog.Builder b = new AlertDialog.Builder(this);
b.setTitle("Please enter a password");
final EditText input = new EditText(this);
b.setView(input);
b.setPositiveButton("OK", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int whichButton)
{
//I get a compile error here, it wants result to be final.
result = input.getText().toString();
}
});
b.setNegativeButton("CANCEL", null);
b.create().show();
Однако я открыт для выполнения чего-то вроде showDialog(int);
, затем используя метод onCreateDialog(int)
и как-то настраивая результат и получая его каким-то другим методом, но я не знаю, как перейти к последней части.
Ответы
Ответ 1
public class MyActivity extends Activity {
private String result;
void showDialog() {
AlertDialog.Builder b = new AlertDialog.Builder(this);
b.setTitle("Please enter a password");
final EditText input = new EditText(this);
b.setView(input);
b.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
result = input.getText().toString();
}
});
b.setNegativeButton("CANCEL", null);
b.show();
}
}
Ответ 2
Упрощенный пример:
public interface TextListener {
void onPositiveResult(CharSequence text);
}
public static AlertDialog getTextDialog(Context ctx,
final TextListener listener) {
View view = LayoutInflater.from(ctx).inflate(R.layout.dialog, null);
final TextView tv = (TextView) view.findViewById(R.id.tv);
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
builder.setView(view);
//
builder.setPositiveButton(android.R.string.ok, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
listener.onPositiveResult(tv.getText());
}
});
builder.setNegativeButton(android.R.string.cancel, null);
return builder.create();
}
- EDIT -
Или вы попробуете этот код:
public class Main extends Activity {
private Button btn;
private String result;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showDialog(0);
}
});
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case 0:
final EditText input = new EditText(this);
return new AlertDialog.Builder(this)
.setIcon(R.drawable.icon)
.setTitle("Please enter a password")
.setView(input)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
Toast.makeText(getBaseContext(), input.getText().toString(), Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
Toast.makeText(getBaseContext(), "Cancel clicked!", Toast.LENGTH_SHORT).show();
}
}).create();
}
return null;
}
}
Ответ 3
Переменный результат, сделайте его переменной-членом вместо локальной переменной. При создании "результата" в качестве переменной-члена он доступен во всей деятельности. (Родительский класс, который расширяет активность)
Ответ 4
Слабое, но быстрое решение:
Объявить метод уровня активности:
TextView lblDiaDestination;
public void dialogReturn(String msg){
lblDiaDestination.setText(msg);
}
и назовите его с помощью положительного кнопочного переключателя:
alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialogReturn( input.getText().toString().trim() );
});
Вы можете изменить значение lblDiaDestination непосредственно перед alert.show():
lblDiaDestination = myTextView;
alert.show():
Ответ 5
Вы можете следовать Dialog учебному курсу на developer.android.com.
Сначала создайте класс диалога:
Добавление списка
Затем добавьте слушателя к этому классу, чтобы передать результат активности.
Передача событий Назад на узел диалога
Ответ 6
Это довольно долго. Надеюсь, мой вклад может быть полезен для новых гостей.
Я думаю, что ключ к ответу на вопрос заключается в объявлении переменной result как члена активности (позвольте ей назвать YourActivity). Затем изнутри метода "onClick" используйте YourActivity.this.result для доступа к этой переменной.
Я редактирую коды @finiteloop, как показано ниже:
public class YourActivity extends Activity {
private String result;
// other activity stuff
void showDialog(){
AlertDialog.Builder b = new AlertDialog.Builder(this);
b.setTitle("Please enter a password");
final EditText input = new EditText(this);
b.setView(input);
b.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
YourActivity.this.result = input.getText().toString();
}
});
b.setNegativeButton("CANCEL", null);
b.create().show();
}
}