如何创建一个自定义AlertDialog,它将能够将输入的数据传递回Android中的调用Activity?

时间:2019-07-18 17:05:42

标签: android android-alertdialog

在我的应用程序中,我希望用户能够做三件事:

  1. 打开一个对话框。
  2. 允许用户在该对话框中输入两个字符串。
  3. 单击“确定”按钮,并将两个字符串传递回呼叫活动。

我正在尝试遵循示例Here,但效果不佳。

这就是我所拥有的:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="10dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="Some Text Here"
        android:textSize="18sp"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <TextView
            style="@style/my_custom_style"
            android:text="From: "
            android:labelFor="@+id/from"/>

        <EditText
            android:id="@+id/from"
            style="@style/my_custom_style"
            android:inputType="date"/>

        <TextView
            style="@style/my_custom_style"
            android:text="To: "
            android:labelFor="@+id/to"/>

        <EditText
            android:id="@+id/to"
            style="@style/my_custom_style"
            android:inputType="date"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:layout_gravity="end"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button_cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/cancel"/>

        <Button

            android:id="@+id/button_okay"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/okay"/>

    </LinearLayout>

</LinearLayout>

这是我的课程,扩展了DialogFragment

public class MyCustomDialogFragment extends DialogFragment
{
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
        LayoutInflater layoutInflater = getActivity().getLayoutInflater();
        alertDialogBuilder.setView(layoutInflater.inflate(R.layout.my_custom_layout, null));
        return alertDialogBuilder.create();
    }

}

现在,在我的通话活动中,我正在尝试这样做:

MyCustomDialogFragment myCustomDialogFragment = new MyCustomDialogFragment();

// Since the onCreate() method of my custom DialogFragment returns an android.app.Dialog, I thought I could do this:

Dialog dialog = new CustomDialogFragment();

当然,这确实可行,我得到了:

Incompatible types.

    Required: android.app.Dialog

    Found: com.me.MyCustomDialogFragment

错误,即使onCreate()方法返回android.app.Dialog也是如此。我什至无法将其转换为Dialog。那么,我该如何从上面实现我的3个目标?

那里有很多示例,但是它们都是默认Google示例的变体,并不是很全面。

1 个答案:

答案 0 :(得分:1)

  

我怎样才能从上面实现我的3个目标?

     
      
  1. 打开一个对话框。
  2.   

在您的show()实例上调用MyCustomDialogFragment,传入FragmentManager。在the framework DialogFragment is deprecated期间,其JavaDocs显示了如何使用show()

  
      
  1. 允许用户在该对话框中输入两个字符串。
  2.   

尽管AlertDialog提供了这些按钮,但您还是希望摆脱按钮的使用,您的布局似乎可以提供此功能。

  
      
  1. 单击“确定”按钮,并将两个字符串传递回呼叫活动。
  2.   

Call setPositiveButton()在您的AlertDialog.Builder上。让您传递到DialogInterface.OnClickListener的{​​{1}}从setPositiveButton()小部件中获取值并将该数据获取到您的活动中(例如,在此片段和活动,并在EditText中用ViewModel的内容更新片段LiveData

This sample app显示了使用ViewModel的基础知识,尽管使用的是自从弃用的框架EditText的实现,而不是使用DialogFragment