Android 填充对话框片段

Android 填充对话框片段,android,android-fragments,spinner,android-alertdialog,android-dialogfragment,Android,Android Fragments,Spinner,Android Alertdialog,Android Dialogfragment,我想创建一个DialogFragment,它有一个标题,然后是一条消息“Select Wifi”,后面是一个微调器。下面是另一条写着“输入昵称”的消息,然后是下面的编辑文本字段。然后是两个按钮,返回微调器和编辑文本的字符串。到目前为止,我有这个代码,但我不明白为什么它不工作 public static class MyAlertDialogFragment extends DialogFragment { public static MyAlertDialogFragment newI

我想创建一个DialogFragment,它有一个标题,然后是一条消息“Select Wifi”,后面是一个微调器。下面是另一条写着“输入昵称”的消息,然后是下面的编辑文本字段。然后是两个按钮,返回微调器和编辑文本的字符串。到目前为止,我有这个代码,但我不明白为什么它不工作

public static class MyAlertDialogFragment extends DialogFragment {

    public static MyAlertDialogFragment newInstance(String title) {
        MyAlertDialogFragment frag = new MyAlertDialogFragment();
        Bundle args = new Bundle();
        args.putString("title", title);
        frag.setArguments(args);
        return frag;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        String title = getArguments().getString("title");
        final EditText input = new EditText(getActivity());
        final Spinner sp = new Spinner(getActivity());

        return new AlertDialog.Builder(getActivity())
                .setTitle(title)
                .setMessage("Select Wifi")
                .setView(sp)
                .setMessage("Enter nickname")
                .setView(input)
                .setPositiveButton("Save",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((MainActivity)getActivity()).doPositiveClick();
                        }
                    }
                )
                .setNegativeButton("Cancel",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((MainActivity)getActivity()).doNegativeClick();
                        }
                    }
                )
                .create();
    }
}

它仅显示编辑文本文件和编辑文本的消息。那么,我如何才能添加一个微调器?或者有没有更好的方法来实现dialogFragment,它可以显示带有多条消息的微调器和editText?甚至可能在微调器中使用提示并编辑文本而不是消息?还有一种方法可以在我的主类中填充一个微调器,然后在对话框中使用该微调器吗?谢谢你的帮助

这里是一个非常简单的自定义对话框片段示例。此代码来自我的一个应用程序:

public class ClaimDialogFragment extends DialogFragment {
Button buttonClaim;
EditText editTextClaim;
String profileId;
String status;
public static ClaimDialogFragment newInstance(Bundle bundle) {
    ClaimDialogFragment myFragment = new ClaimDialogFragment();
    myFragment.setArguments(bundle);
    return myFragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    View view = inflater.inflate(R.layout.fragment_dialog_claim, container,
            false);
    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    getDialog().getWindow().setBackgroundDrawableResource(
            android.R.color.transparent);
    editTextClaim = (EditText) view.findViewById(R.id.editTextClaim);
    buttonClaim = (Button) view.findViewById(R.id.buttonClaim);
    Log.d("point a", editTextClaim.getText().toString() + "");
    return view;
}
@Override
public void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    if (getArguments() != null) {
        profileId = getArguments().getString("profile_id");
    }
    buttonClaim.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
                Toast.makeText(getActivity(),
                        "Please write your claim letter.",
                        Toast.LENGTH_LONG).show(); 
        }
    });
}
}
以及相关的xml代码:

<?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="match_parent"
    android:background="@drawable/dialog_background"
    android:orientation="vertical"
    android:padding="8dp" >

<EditText
    android:id="@+id/editTextClaim"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="4dp"
    android:background="@drawable/edittext_border_background"
    android:ems="10"
    android:gravity="top"
    android:hint="Cover letter for the claim"
    android:inputType="textMultiLine"
    android:minLines="5"
    android:padding="4dp" >

    <requestFocus />
</EditText>

<Button
    android:id="@+id/buttonClaim"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/button_black"
    android:paddingTop="8dp"
    android:text="/Claim"
    android:textColor="@color/white"
    android:textStyle="bold" />
还请注意,可以对片段使用newInstance()静态方法。 以下是我的应用程序中此代码的快照:
这里是一个非常简单的自定义对话框片段示例。此代码来自我的一个应用程序:

public class ClaimDialogFragment extends DialogFragment {
Button buttonClaim;
EditText editTextClaim;
String profileId;
String status;
public static ClaimDialogFragment newInstance(Bundle bundle) {
    ClaimDialogFragment myFragment = new ClaimDialogFragment();
    myFragment.setArguments(bundle);
    return myFragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    View view = inflater.inflate(R.layout.fragment_dialog_claim, container,
            false);
    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    getDialog().getWindow().setBackgroundDrawableResource(
            android.R.color.transparent);
    editTextClaim = (EditText) view.findViewById(R.id.editTextClaim);
    buttonClaim = (Button) view.findViewById(R.id.buttonClaim);
    Log.d("point a", editTextClaim.getText().toString() + "");
    return view;
}
@Override
public void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    if (getArguments() != null) {
        profileId = getArguments().getString("profile_id");
    }
    buttonClaim.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
                Toast.makeText(getActivity(),
                        "Please write your claim letter.",
                        Toast.LENGTH_LONG).show(); 
        }
    });
}
}
以及相关的xml代码:

<?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="match_parent"
    android:background="@drawable/dialog_background"
    android:orientation="vertical"
    android:padding="8dp" >

<EditText
    android:id="@+id/editTextClaim"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="4dp"
    android:background="@drawable/edittext_border_background"
    android:ems="10"
    android:gravity="top"
    android:hint="Cover letter for the claim"
    android:inputType="textMultiLine"
    android:minLines="5"
    android:padding="4dp" >

    <requestFocus />
</EditText>

<Button
    android:id="@+id/buttonClaim"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/button_black"
    android:paddingTop="8dp"
    android:text="/Claim"
    android:textColor="@color/white"
    android:textStyle="bold" />
还请注意,可以对片段使用newInstance()静态方法。 以下是我的应用程序中此代码的快照:

您可以使用
setView()
方法为AlertDialog的内容设置自定义布局

所以,只要做一个适合你需要的布局。在本例中,是包含视图(消息、编辑文本和微调器)的线性布局。假设您将其命名为
my_dialog.xml
,那么您可以这样使用它:

public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater inflater = LayoutInflater.from(getActivity());
    LinearLayout root = (LinearLayout) inflater.inflate(R.layout.my_dialog, null);

    // get your Views with findViewById, and initialize them
    //
    // Spinner sp = (Spinner) root.findViewById()...
    // ...
    // ...

    return new AlertDialog.Builder(getActivity())
         .setTitle(title)
         .setView(root)
         .setPositiveButton("Save",
              new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog, int whichButton) {
                     // you can access you Views here 
                     // and gather the info that you need

                     // you can modify doPositiveClick to
                     // accept that info as parameters
                     // so the parent Activity can get it
                     ((MainActivity)getActivity()).doPositiveClick(param1, param2);
                 }
             }
         )
         .setNegativeButton("Cancel",
             new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog, int whichButton) {
                     ((MainActivity)getActivity()).doNegativeClick();
                 }
             }
         )
         .create();

使用自定义视图,您仍然可以使用AlertDialog的内置功能(如标题、正/负按钮等)。

您可以使用
setView()
方法为AlertDialog的内容设置自定义布局

所以,只要做一个适合你需要的布局。在本例中,是包含视图(消息、编辑文本和微调器)的线性布局。假设您将其命名为
my_dialog.xml
,那么您可以这样使用它:

public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater inflater = LayoutInflater.from(getActivity());
    LinearLayout root = (LinearLayout) inflater.inflate(R.layout.my_dialog, null);

    // get your Views with findViewById, and initialize them
    //
    // Spinner sp = (Spinner) root.findViewById()...
    // ...
    // ...

    return new AlertDialog.Builder(getActivity())
         .setTitle(title)
         .setView(root)
         .setPositiveButton("Save",
              new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog, int whichButton) {
                     // you can access you Views here 
                     // and gather the info that you need

                     // you can modify doPositiveClick to
                     // accept that info as parameters
                     // so the parent Activity can get it
                     ((MainActivity)getActivity()).doPositiveClick(param1, param2);
                 }
             }
         )
         .setNegativeButton("Cancel",
             new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog, int whichButton) {
                     ((MainActivity)getActivity()).doNegativeClick();
                 }
             }
         )
         .create();


使用自定义视图,您仍然可以使用AlertDialog的内置功能(如标题、正/负按钮等)。

为什么要从扩展DialogFragment的自定义类返回AlertDialog?你可以像活动一样使用自定义类来处理xml文件和setcontent视图方法。我还在努力学习。如果我想要一个简单的对话框,它将返回一个微调器和一个editText的值,我应该使用什么来代替呢?谢谢你的快速回复@ILLEGARGUMENT为什么要从扩展DialogFragment的自定义类返回AlertDialog?你可以像活动一样使用自定义类来处理xml文件和setcontent视图方法。我还在努力学习。如果我想要一个简单的对话框,它将返回一个微调器和一个editText的值,我应该使用什么来代替呢?谢谢你的快速回复@IllegalArgumentOkay,我用错误的方式思考对话。因此,最好将它们放在自己的类中,这样您就可以使用xml编辑视图了?对话框总是有一个类,它可能是由其他人(android)提供的,也可能是您自己的。这不需要在它自己的类中,但我喜欢这样来保持我的代码有条理。提供自定义xml是为了根据您的喜好设置对话框的样式。使用AlertDialog时选项很少。请参阅我的答案,了解“非常少”选项:)在我看来,使用AlertDialog要容易得多,因为它提供了一些功能。(标题、负面/正面按钮处理等)我希望有办法给出两个绿色复选框答案,谢谢您的帮助@IllegalArgumentOkay,我用错误的方式思考对话。因此,最好将它们放在自己的类中,这样您就可以使用xml编辑视图了?对话框总是有一个类,它可能是由其他人(android)提供的,也可能是您自己的。这不需要在它自己的类中,但我喜欢这样来保持我的代码有条理。提供自定义xml是为了根据您的喜好设置对话框的样式。使用AlertDialog时选项很少。请参阅我的答案,了解“非常少”选项:)在我看来,使用AlertDialog要容易得多,因为它提供了一些功能。(标题、负面/正面按钮处理等)我希望有办法给出两个绿色复选框答案,谢谢您的帮助@非法辩论谢谢!这是我一直在寻找的,优雅而简单@kupsefI尝试实现此功能,但我在充气机上遇到错误。充气机说它不能接受参数int。此外,getActivity()调用也给了我错误。知道会发生什么吗@kupsefWell,充气需要2个参数,我根据这个更新了我的答案。getActivity()会出现什么错误?它表示类型MainActivity的方法getActivity()未定义@库普塞夫你在MainActivity干什么?您应该在MyAlertDialogFragment中执行此操作。(正如你在上面的问题中所做的)谢谢!这是我一直在寻找的,优雅而简单@kupsefI尝试实现此功能,但我在充气机上遇到错误。充气机说它不能接受参数int。此外,getActivity()调用也给了我错误。知道会发生什么吗@kupsefWell,充气需要2个参数,我根据这个更新了我的答案。getActivity()会出现什么错误?它表示类型MainActivity的方法getActivity()未定义@库普塞夫你在MainActivity干什么?您应该在MyAlertDialogFragment中执行此操作。(正如你在上述问题中所做的那样。)