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