2013-07-25 145 views
1

實現對話框這裏是我的對話框與複選框

public class CustomDialogClass extends Dialog implements 
 android.view.View.OnClickListener { 

     public Activity c; 
     public Dialog d; 
     public Button no; 
     CheckBox yes; 
     boolean p; 
     public CustomDialogClass(Activity a) { 
         super(a); 
         // TODO Auto-generated constructor stub 
         this.c = a; 
     } 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         requestWindowFeature(Window.FEATURE_NO_TITLE); 
         setContentView(R.layout.custom_dialog); 
         yes = (CheckBox) findViewById(R.id.checkBox1); 
         no = (Button) findViewById(R.id.btn_no); 
         no.setOnClickListener(this); 
         yes.setChecked(false); 
         yes.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
         switch (v.getId()) { 
         case R.id.checkBox1: 
             yes.setChecked(true); 
             break; 
         case R.id.btn_no: 
             dismiss(); 
             break; 
         default: 
             break; 
         } 
     } 
 } 

現在,我打開對話框,選中該複選框,單擊按鈕,關閉對話框。但是當我再次打開它時,複選框又被取消選中。我該怎麼辦?

+0

的提示是的onCreate(捆綁savedInstanceState)給出。您需要保存複選框值,然後將其傳回以從savedInstanceState包中檢索它們。 –

+0

現在不好使用Dialog。強烈建議使用DialogFragment方法。 showDialog()從API級別13開始被棄用。請參閱下面的答案。 – a11n

回答

6

不推薦使用對話方式!您應該考慮使用DialogFragment

問題爲什麼你失去了檢查狀態是因爲重新打開時會重新創建對話框。

請參見DialogFragment方法的示例http://developer.android.com/reference/android/app/DialogFragment.html。你會看到你可以傳遞參數給對話框。

對於解決方案,我建議當關閉對話框時,將選定的值傳遞迴主機活動...當對話框應該重新打開時,只需將參數傳遞給對話框,以便對話框設置其默認選擇。

編輯:

  1. 既然你想顯示一個複選框,我會採取和 http://developer.android.com/guide/topics/ui/dialogs.html#AddingAList 的複選框適應 示例代碼。使用AlertDialog.Builder的 仍然很方便。

  2. 將生成器封裝到DialogFragment中,方法是覆蓋 onCreateDialog方法。您可以通過 Bundle將所選項目的列表作爲布爾數組傳遞,然後將其用於setMultiChoiceItems。

    public class CheckBoxAlertDialogFragment extends DialogFragment { 
        public static CheckBoxAlertDialogFragment newInstance(boolean[] checkedItems) { 
         CheckBoxAlertDialogFragment frag = new CheckBoxAlertDialogFragment(); 
         Bundle args = new Bundle(); 
         args.putBooleanArray("checkedItems", checkedItems); 
         frag.setArguments(args); 
         return frag; 
    } 
    
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
        final boolean[] checkedItems = getArguments().getBooleanArray("checkedItems"); 
    
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
        // Set the dialog title 
        builder.setTitle(R.string.pick_toppings) 
          // Specify the list array, the items to be selected by default (null for none), 
          // and the listener through which to receive callbacks when items are selected 
          .setMultiChoiceItems(R.array.toppings, checkedItems, 
            new DialogInterface.OnMultiChoiceClickListener() { 
             @Override 
             public void onClick(DialogInterface dialog, int which, 
                  boolean isChecked) { 
              checkedItems[which] = isChecked; 
             } 
            }) 
          // Set the action buttons 
          .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int id) { 
            // User clicked OK, so save the checkedItems results somewhere 
            // or return them to the component that opened the dialog 
            //... 
           } 
          }) 
          .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int id) { 
            //... 
           } 
          }); 
    
        return builder.create(); 
    } 
    } 
    
  3. 在你的活動,你應該有一個變量,例如名爲checkedItems,類型爲布爾型[]某處可以保存複選框狀態。您可以打開對話框,然後用:

    void showDialog() { 
         DialogFragment newFragment = CheckBoxAlertDialogFragment.newInstance(checkedItems); 
         newFragment.show(getFragmentManager(), "dialog tag"); 
        } 
    
+0

對不起。我仍然無法得到它。你可以向我展示你通過複選框狀態的代碼。特別是我對android和對話框很陌生。這將是非常有益的 – VipulKumar

1

您的複選框將在您每次顯示/創建對話框時取消選中,因爲在其onCreate方法中您有yes.setChecked(false);。除了解除對話框之外,您應該在解除對話之前保存複選框的值,並在每次創建對話框時獲取該值以重置複選框。你可以使用SharedPreferences來保存這個值,即使你的Activity被銷燬,或者根據需要來回傳遞你的主要活動的值。

感謝@andd,我忘記了Dialog已被棄用,他認爲您應該使用DialogFragment,在這種情況下SharedPreferences不是必需的。

+1

但我認爲DialogFragment需要最小的API 11,但在我的項目min API是8 – VipulKumar

+0

您可以使用Android 3.0之前的設備的支持片段 – TronicZomB