【问题标题】:Populating a Dialog Fragment填充对话框片段
【发布时间】:2014-06-21 01:10:35
【问题描述】:

我想创建一个 DialogFragment,它有一个标题,然后是一条消息“选择 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();
    }
}

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

【问题讨论】:

  • 为什么要从扩展 DialogFragment 的自定义类返回 AlertDialog?您可以像使用 xml 文件和 setcontent 视图方法的活动一样使用自定义类。
  • 我尝试根据 android 文档站点来做这件事。我还在努力学习。如果我想要一个简单的对话框来返回一个微调器和一个editText的值,我应该使用什么来代替?感谢您的快速回复。 @IllegalArgument

标签: android android-fragments spinner android-alertdialog android-dialogfragment


【解决方案1】:

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

因此,只需制作适合您需求的布局即可。在这种情况下,包含您的视图(消息、EditText 和 Spinner)的 LinearLayout。假设您将其命名为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 的内置功能(如标题、正/负按钮等...)。

【讨论】:

  • 谢谢!这就是我一直在寻找的,优雅而简单。 @kupsef
  • 我尝试实现这一点,但我在 inflator.inflate 上遇到错误,说它不能接受参数 int。此外, getActivity() 调用给了我错误。知道会发生什么吗? @kupsef
  • 好吧,inflate 需要 2 个参数,我据此更新了我的答案。 getActivity() 会出现什么错误?
  • 它表示方法 getActivity() 对于 MainActivity 类型未定义。 @kupsef
  • 你在 MainActivity 中做什么?您应该在 MyAlertDialogFragment 中执行此操作。 (就像您在上面的问题中所做的那样。)
【解决方案2】:

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

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" />

这就是我如何称呼这个对话框片段:

FragmentTransaction ft = getActivity()
                            .getSupportFragmentManager().beginTransaction();
                    DialogFragment fragment = new ClaimDialogFragment();
                    fragment.show(ft, null);

还请注意,您可以对片段使用 newInstance() 静态方法。 这是我的应用程序中此代码的快照:

【讨论】:

  • 好吧,我想错了对话。所以最好将它们放在自己的类中,这样您就可以使用 xml 编辑视图?
  • 对话框总是有一个类,它可能由其他人(android)提供,也可以是你自己的。这不需要在它自己的类中,但我喜欢这样来保持我的代码井井有条。提供自定义 xml 是为了根据您的喜好设置对话框的样式。使用 AlertDialog 时选项很少。
  • 查看我对“非常少”选项的回答:) 在我看来,使用 AlertDialog 更容易,因为它提供了一些功能。 (标题、否定/肯定按钮处理等...)
  • 我希望有办法给出两个绿色检查答案,感谢您的所有帮助。 @IllegalArgument
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多