#android #android-edittext #android-alertdialog
#Android #android-edittext #android-alertdialog
Вопрос:
Я использую AlertDialog.Конструктор для отображения диалогового окна с предложением пользователю ввести пароль, затем я хочу сохранить этот пароль в настройках, однако я не могу понять, как получить результат из метода ввода диалогового окна оповещения.
Вот, по сути, то, что я хотел бы иметь возможность делать:
String resu<
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. Смотрите также Обратный вызов в AlertDialog
Ответ №1:
public class MyActivity extends Activity {
private String resu<
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();
}
— РЕДАКТИРОВАТЬ —
Или попробуйте этот код:
public class Main extends Activity {
private Button btn;
private String resu<
/** 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;
}
}
Комментарии:
1. Извините, я не совсем понимаю, что здесь происходит, или как я мог бы использовать это для достижения того, чего я пытаюсь достичь.
2. evilone предлагает вам использовать шаблон Observer и создать свой собственный прослушиватель (TextListener). Ваша активность, в которой размещен этот AlertDialog, может затем реализовать TextListener, который вызовет onPositiveResult (CharSequence) вне AlertDialog, и он передаст результат, который вы ищете, на основе вашего вопроса. Затем вы можете действовать с вашим результатом по своему усмотрению.
Ответ №3:
Вы можете следовать руководству по диалогу в developer.android.com .
Сначала создайте класс диалога:
Затем добавьте прослушиватель в этот класс, чтобы передать результат в действие.
Ответ №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:
Переменный результат, сделайте его переменной-членом вместо локальной переменной. Сделав «result» переменной-членом, он доступен во всем activity.(родительский класс, который расширяет активность)
Комментарии:
1. 1 за правильный ответ. Я выбрал @Femi, потому что он был более надежным. Спасибо!
Ответ №6:
Это довольно долго. Я надеюсь, что мой вклад может быть полезен для новичков. Я думаю, что ключом к ответу на вопрос является объявление переменной result как члена activity (давайте назовем это YourActivity). Затем изнутри метода «onClick» используйте YourActivity.this.result для доступа к этой переменной.
Я редактирую коды @finiteloop, как показано ниже:
public class YourActivity extends Activity {
private String resu<
// 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();
}
}