Как передать значения между диалогом и активностью?
Я прошу пользователя ввести данные через диалог:
package com.android.cancertrials;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class CustomDialog extends Dialog {
private String name;
// private ReadyListener readyListener;
public static EditText etName;
public String zip;
public CustomDialog(Context context, String name) {
super(context);
this.name = name;
// this.readyListener = readyListener;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mycustomdialog);
setTitle("Enter the Zip Code ");
Button buttonOK = (Button) findViewById(R.id.ok);
buttonOK.setOnClickListener(new OKListener());
etName = (EditText) findViewById(R.id.EditZip);
}
private class OKListener implements android.view.View.OnClickListener {
@Override
public void onClick(View v) {
// readyListener.ready(String.valueOf(etName.getText()));
CustomDialog.this.dismiss();
}
}
}
Когда пользователь нажимает "ОК", как я могу передать значение, введенное в текстовое поле, обратно в переменную-член в Activity, которая запустила его?
Ответы
Ответ 1
Вы можете сделать это по-разному... на самом деле, если в вашем диалоговом окне есть только кнопка "ОК", чтобы отклонить, почему бы вам просто не создать пользовательское диалоговое окно, используя класс AlertDialog.Builder
вместо подкласса Dialog
В любом случае... пусть у вас есть веские причины сделать это так, как вы это сделали. В этом случае я бы использовал ObserverPattern. Что-то вроде этого:
public class CustomDialog extends Dialog {
private String name;
public static EditText etName;
public String zip;
OnMyDialogResult mDialogResult; // the callback
public CustomDialog(Context context, String name) {
super(context);
this.name = name;
}
@Override
public void onCreate(Bundle savedInstanceState) {
// same you have
}
private class OKListener implements android.view.View.OnClickListener {
@Override
public void onClick(View v) {
if( mDialogResult != null ){
mDialogResult.finish(String.valueOf(etName.getText()));
}
CustomDialog.this.dismiss();
}
}
public void setDialogResult(OnMyDialogResult dialogResult){
mDialogResult = dialogResult;
}
public interface OnMyDialogResult{
void finish(String result);
}
}
В вашей деятельности:
CustomDialog dialog;
// initialization stuff, blah blah
dialog.setDialogResult(new OnMyDialogResult(){
public void finish(String result){
// now you can use the 'result' on your activity
}
});
Чтение кода, похоже, вы уже пробовали что-то подобное.
Изменить: сделать это простым способом
Вы можете использовать макет mycustomdialog
. Вот как вы могли бы использовать AlertDialog.Builder
:
LayoutInflater inflater = LayoutInflater.from(YourActivity.this);
final View yourCustomView = inflater.inflate(R.layout.mycustomdialog, null);
final TextView etName = (EditText) yourCustomView.findViewById(R.id.EditZip);
AlertDialog dialog = new AlertDialog.Builder(YourActivity.this)
.setTitle("Enter the Zip Code")
.setView(yourCustomView)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
mSomeVariableYouHaveOnYourActivity = etName.getText().toString();
}
})
.setNegativeButton("Cancel", null).create();
dialog.show();
Ответ 2
Я достигаю этого через намерение трансляции от [диалог] до [активность].
Сначала передайте активность в функцию:
public class DialogFactory {
public static AlertDialog addSomeDialog(Activity activity) {
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (SOMETHING_IS_TRUE) {
// prepare your parameters that need to be sent back to activity
Intent intent = new Intent(IntentAction.INTENT_ADD_TASK);
intent.putExtra(IntentConst.PARAM_A, aInput);
intent.putExtra(IntentConst.PARAM_B, bInput);
activity.sendBroadcast(intent);
Toast.makeText(activity, "Something is TRUE!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(activity, "Something NOT TRUE!", Toast.LENGTH_SHORT).show();
}
}
});
}
}
Вызовите функцию выше, когда в вашей деятельности активировано какое-либо меню или кнопка.
Затем подготовьте свою деятельность, чтобы получить намерение с помощью BroadcastReceiver в действии:
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction() == IntentAction.INTENT_ADD_TASK) {
// Do whatever you want to refresh the layout or anything in the activity
// or even ask fragments inside to act upon it.
.....
}
}
};
Не забудьте зарегистрировать и не зарегистрировать приемник:
@Override
protected void onPause() {
unregisterReceiver(mReceiver);
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(mReceiver, new IntentFilter(IntentAction.INTENT_ADD_TASK));
}
Ответ 3
public void openDialog() {
// CustomDailog customDailog = new CustomDailog();
// customDailog.show(getSupportFragmentManager(), "custom dialog");
final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.dailog_layout) ;
dialog.setTitle("Upadate");
String name1 = editTextName.getText().toString();
String contactno1 = editTextContact.getText().toString();
String date1=editTextDate.getText().toString();
String email1=editTextEmail.getText().toString();
String qualification=editTextQualification.getText().toString();
String time1=editTextTime.getText().toString();
listener.applyTexts(name1,email1,contactno1,date1,qualification,time1);
editTextName = dialog.findViewById(R.id.et_name1);
editTextEmail =dialog.findViewById(R.id.et_email);
editTextContact = dialog.findViewById(R.id.et_phoneno);
editTextQualification=dialog.findViewById(R.id.et_qualification);
editTextDate=dialog.findViewById(R.id.datepicker1);
editTextTime=dialog.findViewById(R.id.timepicker1);
Button dailogbutton;
dailogbutton=(Button)findViewById(R.id.dailogbutton);
dailogbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
return AlertDialog.Builder.create();
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
listener = (CustomDailog.ExampleDialogListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString() +
"must implement ExampleDialogListener");
}
}
public interface ExampleDialogListener {
void applyTexts(String name, String email, String contactno, String date, String qualification,String time);
}
private void addMethod() {
mPersonList.add(new Person("Narendra","[email protected]","987654","12-09-1996","Mba","9-09 AM"));
mPersonList.add(new Person("kalyan","[email protected]","43255","1-09-1996","degree","8-09 AM"));
mPersonList.add(new Person("banu","[email protected]","65454","2-09-1996","puc","7-09 AM"));
mPersonList.add(new Person("teja","[email protected]","54646","12-07-1996","btech","8-09 AM"));
mPersonList.add(new Person("vinod","[email protected]","67675","12-3-1996","degree","6-09 AM"));
}
private void setAdapter() {
adapter = new PersonListAdapter(SecondActivity.this, mPersonList);
lvPerson.setAdapter(adapter);
}
@Override
public void applyTexts(String name, String email, String contactno, String date, String qualification, String time) {
mPersonList.add(new Person(0,name,contactno,email,qualification,time,date));
Log.d("Persons",mPersonList.size()+" ");
adapter.notifyDataSetChanged();
}
}
как передать значения edittext в активность edittexts