如何在Android中从自定义对话框接收返回的数据?

4

我有一个带有一个按钮和一个编辑框的第一个活动。当我点击该按钮时,我需要将数据列表从第一个活动传递到第二个活动。

第二个活动将把它作为列表显示出来。如果用户从列表中选择一个,那么特定的数据应该返回到被调用的活动(第一个活动),并应该显示在EditText框中。我该怎么做?

我的FirstActivity:

public class First extends Activity {

    Button click;
    EditText edit;

    ArrayList<String> site=new ArrayList<String>();
    String[] sitestr=new String[]{"monkey","donkey","Elephant","Baffalo"};


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        click=(Button)findViewById(R.id.click);
        edit=(EditText)findViewById(R.id.edit);

        click.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {


                  CustomizeDialog1 customizeDialog = new CustomizeDialog1(tu.this,sitestr);
                  customizeDialog.show();

            }
        });
}

第二点:

public class CustomizeDialog1 extends Dialog implements OnClickListener, OnItemClickListener {
  String selected_value;
  Button okButton;
  String hi[];
//  ListView list_view;

  public CustomizeDialog1(Context context,String[] value) {
    super(context);
    hi=value;
   // Log.v("Length",""+hi.length);
    /** 'Window.FEATURE_NO_TITLE' - Used to hide the title */
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    /** Design the dialog in main.xml file */
    setContentView(R.layout.listviewinflate);

    ListView lst=(ListView)findViewById(R.id.list1);

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_list_item_1,hi);

     lst.setAdapter(adapter);
     lst.setOnItemClickListener(this);

   okButton = (Button) findViewById(R.id.cancel);
   okButton.setOnClickListener(this);
  }

  @Override
  public void onClick(View v) {
    /** When OK Button is clicked, dismiss the dialog */
    if (v == okButton)
      dismiss();
  }

  @Override
  public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    // TODO Auto-generated method stub
    selected_value=hi[arg2];
    //Log.v("selected_value", selected_value);
    Toast.makeText(getContext(), selected_value,Toast.LENGTH_SHORT).show();
}
}
5个回答

15

你可以像这样拥有自定义回调 interface

public static interface MyDialogListener
{
    public void userSelectedAValue(String value);
    public void userCanceled();
}

在你的 CustomizeDialog1 中将它声明为类成员并为它创建 setter & getter。然后在你的 ActivityonClick 中:

public void onClick(View v){
    CustomizeDialog1 customizeDialog = new CustomizeDialog1(tu.this,sitestr);
    customizeDialog.setMyDialogListener( new MyDialogListener()
    {
    public void userSelectedAValue(String value)
    {
        //use value
    }
    public void userCanceled()
    {
    }
    });
    customizeDialog.show();

}

当用户按下OK按钮时,在您的CustomizeDialog1中。

public void onClick(View v)
{
    /** When OK Button is clicked, dismiss the dialog */
    if (v == okButton)
    {
        listener.userSelectedAValue(selected_value);
        // listener is object of your MyDialogListener, which you have set from
        // Activity.
        dismiss();
    }
}

1
为了完整性:在您的对话框类中添加一行: private MyDialogListener listener; 为此侦听器,生成setter,可以从调用类中使用以指定接口实现。 - Harmen
非常好的答案,谢谢!我忘记了接口是多么简单和棒极了! - qkzoo1978

1

谢谢您的回复。我只需要自定义对话框。 - sanjay

1

感谢@Adil Soomro

我将为初学者分享完整的代码。

  1. Create Interface for sharing purposes. ==> Listener.java
  2. Declare the Listener as your class member and generate setter and getter for this. ==> Dialog.java
  3. ​When you create a Dialog Object, Please set Listener ==> MainActicity.java

           **customDialog.setListener(new Listener() {
               public void onReturnValue(String yourInput) {
                  Lod.d("MainActivity","you keyed in : "+yourInput);
               }
           });**
    

MainActivity

public class MainActivity extends AppCompatActivity {
PieChart pieChart;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);
   ...
    Button button =  findViewById(R.id.recordButton);
    final TextView main_label = findViewById(R.id.main_label);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Dialog customDialog = new Dialog(MainActivity.this);
            customDialog.setListener(new Listener() {
                public void onReturnValue(String yourInput) {
                   Lod.d("MainActivity","you keyed in : "+yourInput);
                }
            });
            customDialog.showDialog(main_label);
        }
    });




}

主活动 XML

    ..
    <TextView //place that you want to locate your dialog
        android:id="@+id/main_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Main Label"
        android:textSize="20dp"
        android:textColor="#000000"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
...
     <Button
            android:id="@+id/recordButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="46dp"
            android:text="Record" />
    ..

对话框
public class Dialog extends AppCompatActivity {
private Context context;
private Listener listener;

public Dialog() {
}
public Dialog(Context context) {
    this.context = context;
}

public void showDialog(final TextView main_label) {
    final Dialog dlg = new Dialog(context);
    dlg.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dlg.setContentView(R.layout.activity_record_dialog);
    dlg.show();

    final EditText readPage = dlg.findViewById(R.id.readPage);
    final Button okButton = dlg.findViewById(R.id.okButton);


    okButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            main_label.setText(readPage.getText().toString());
            Toast.makeText(context, "\"" +  readPage.getText().toString() + "\" ", Toast.LENGTH_SHORT).show();

            listener.onReturnValue(readPage.getText().toString());
            dlg.dismiss();
        }
    });
    ...

    public Listener getListener() {
       return listener;
    }

    public void setListener(Listener listener) {
       this.listener = listener;
    }

侦听器

...
public interface Listener {
    public void onReturnValue(String input);
}

0
  1. 将customizeDialog变为First类中的一个变量
  2. 让First实现OnDismissListener接口
  3. 使用public void onDismiss(DialogInterface dialog)检查对话框中的用户输入/调用新活动


    public class First extends Activity implements OnDismissListener {
    CustomizeDialog1 customizeDialog;
    public void onDismiss(DialogInterface dialog) {
         //使用customizeDialog
         //例如获取所选值
    }
    

别忘了编辑CustomizeDialog1类,并添加getter方法,以便在onDismiss中能够知道用户选择的内容。


没问题。但是当用户从列表中选择一个项目时,应该将其返回到第一个活动。我该如何接收它? - sanjay

0

针对你的问题——如何在活动之间传递数据,你也可以通过AlertDialog实现这一功能。要在一个活动中向另一个活动传递数据,你可以使用意图(Intent)实现:

Intent intent = new Intent(context, ActivitytoStart.class);
   intent.putExtra(key, value);
   startActivity(intent);

在其他活动中,您可以通过以下方式获取该数据:

getIntent().getExtras().get(key);

为了让你的EditText获取数据返回,你可以使用以下方法:
startActivityForResult(intent, 0);

然后在其他活动中像这样设置值:

private void setData(){
      Bundle conData = new Bundle();
      conData.putString(key, value);
      Intent intent = new Intent();
      intent.putExtras(conData);
      setResult(RESULT_OK, intent);
}

然后在您的调用活动中接收此数据:

   @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == RESULT_OK){
    //Fetch data as above thru Intent(data)
    and set the value to your edittext
    }
}

没问题,但是CustomizeDialog1.java不是一个Activity,它是一个对话框类。 - sanjay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接