0

我想创建一个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,并带有多条消息?甚至可能在微调器中使用提示并编辑文本而不是消息?还有一种方法可以在我的主类中填充微调框,然后在对话框中使用该微调框?谢谢你的帮助。

+0

你为什么要从正在扩展DialogFragment的自定义类中返回AlertDialog?您可以像使用xml文件和setcontent视图方法的活动一样使用自定义类。 –

+0

我试图根据android文档网站做到这一点。我仍然在努力学习。如果我想要一个简单的对话框来返回一个微调值和一个editText,我应该用什么来代替?感谢您的快速回复。 @IllegalArgument – mtorres

回答

2

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

所以,只要做出适合您需求的布局即可。在这种情况下,LinearLayout包含您的视图(消息,EditText和Spinner)。比方说,你把它命名为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的内置功能(如标题,正/负按钮等... )。

+0

谢谢!这就是我一直在寻找的东西,简洁而优雅。 @kupsef – mtorres

+0

我试图实现这一点,但我在充气机上出现错误。夸大说它不能带参数int。另外,getActivity()调用给我错误。任何想法可能会发生什么? @kupsef – mtorres

+0

那么,充气需要2个参数,我根据这个更新了我的答案。你用getActivity()得到什么错误? – kupsef

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()静态方法。 下面是我的应用程序的代码的快照: enter image description here

+0

好吧,我正在考虑以错误的方式进行对话。所以最好让他们在自己的类中,这样你可以使用xml编辑视图? – mtorres

+1

一个对话框将始终有一个可能由其他人提供的类(android),或者可以是您自己的。这并不需要在自己的类中,但我喜欢这种方式来保持我的代码组织。提供自定义xml用于根据自己的喜好设计对话框样式。使用AlertDialog时有很少的选项。 –

+2

查看我的答案,“非常少”选项:)在我看来,使用AlertDialog更容易,因为它提供的功能。 (标题,负面/正面按钮处理,等等......) – kupsef