2012-12-13 39 views
9

Tôi muốn tạo ra một cách người dùng có thể chọn các tùy chọn như hình dưới đâyTuỳ chỉnh Dialog với setMultiChoiceItems

enter image description here

Ngay bây giờ đang làm như sau

public static class CategoriesDialogFragment extends SherlockDialogFragment { 

    public static CategoriesDialogFragment newInstance(int title) { 
     CategoriesDialogFragment frag = new CategoriesDialogFragment(); 
     Bundle args = new Bundle(); 
     args.putInt("title", title); 
     frag.setArguments(args); 
     return frag; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     int title = getArguments().getInt("title"); 

     return new AlertDialog.Builder(getActivity()) 
       .setIcon(R.drawable.alert_dialog_icon) 
       .setTitle(title) 
       .setMultiChoiceItems(_categories, _selections, 
         new DialogSelectionClickHandler()) 
       .setPositiveButton(R.string.alert_dialog_ok, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, 
            int whichButton) { 
           ((MainActivity) getActivity()) 
             .doPositiveClick(); 
          } 
         }).create(); 

     /* 
     * .setNegativeButton(R.string.alert_dialog_cancel, new 
     * DialogInterface.OnClickListener() { public void 
     * onClick(DialogInterface dialog, int whichButton) { 
     * ((MainActivity) getActivity()) .doNegativeClick(); } }) 
     */ 
    } 

    public class DialogSelectionClickHandler implements 
      DialogInterface.OnMultiChoiceClickListener { 
     public void onClick(DialogInterface dialog, int clicked, 
       boolean selected) { 
      // Log.i("ME", _options[clicked] + " selected: " + selected); 
     } 
    } 

} 

Nhưng tôi muốn thêm ALL tùy chọn như hình ảnh. Vì vậy, tôi nghĩ rằng tôi sẽ phải xây dựng một Dialog tùy chỉnh. Tôi vẫn có thể mở rộng các setMultiChoiceItems gốc để nó sẽ giảm bớt việc xử lý mã của tôi.

+0

'Builder' có phương thức' setCustomTitle (View) '. – Luksprog

+0

@Luksprog cần có hộp kiểm. như thể hiện trong hình ảnh. để khi tôi nhấp vào đó, tôi muốn kiểm tra hoặc bỏ chọn tất cả nội dung bên trong nội dung hộp thoại. –

+0

Cũng cung cấp chế độ xem cho phương thức có chứa 'TextView' (tiêu đề thực tế) và hộp kiểm' all' '. – Luksprog

Trả lời

9

Bạn có thể có thể sử dụng phương pháp setCustomTitle() của lớp AlertDialog.Builder và xây dựng tiêu đề của riêng bạn trong đó có các văn bản tiêu đề và cũng là tất cảCheckBox, một cái gì đó như thế này:

new AlertDialog.Builder(getActivity()) 
       .setIcon(R.drawable.alert_dialog_icon) 
       .setTitle(title) 
       .setCustomTitle(getLayoutInflater().inflate(R.layout.custom_title, null)); 

nơi R.layout.custom_title là:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <TextView 
     android:id="@+id/textView1" 
     style="?android:attr/textAppearanceLarge" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="Dialog title" 
     android:textColor="#ffffff" /> 

    <TextView 
     android:id="@+id/all" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="All" 
     android:textColor="#ffffff" /> 

    <CheckBox 
     android:id="@+id/checkBox1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

Các chỉnh sửa kiểu khác phải được thực hiện để làm cho nó trông đẹp hơn. Nhưng nhìn thấy toàn bộ bố cục hộp thoại, bạn có thể muốn sử dụng lớp Dialog tùy chỉnh, trong đó phương thức setMultiChoice() sẽ không khả dụng (nhưng cuối cùng sẽ dễ dàng sao chép).

+0

Phương thức getLayoutInflater (Bundle) trong loại DialogFragment không áp dụng cho các đối số() –

+0

@HarshaMV 'getActivity(). GetLayoutInflater()' – Luksprog

+0

Tôi đã làm như trên và tôi đã thực hiện tiêu đề tùy chỉnh của mình nhưng làm cách nào tôi có thể nhận được các giá trị từ Các vật thể ? findViewById không hoạt động:/ –

2

Tôi đã đạt được điều mà bạn đang hiển thị trong hình ảnh. những gì tôi đã sử dụng là đối thoại tùy chỉnh như bạn đang nghĩ đến sử dụng. tôi đã sử dụng Listview bên trong tệp xml.

Trước hết Hãy xác định khởi tạo danh sách mảng bên dưới.

// Catagory Selection 
    public static ArrayList<String> acceptpositionwhoesNearMe = new ArrayList<String>(); 
    public static String AcceptCatagotyIDWhoesNearMe = ""; 

Dưới đây là Bộ luật ShowDialog() tôi đã qua sử dụng.

public void showDialog() { 
     Log.i(TAG, "Inside Show Dialog"); 
     final Dialog warning = new Dialog(logout_dialogue.this); 
     warning.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     warning.setContentView(R.layout.YOUR_XML); 
     warning.setCancelable(false); 
     warning.getWindow().setGravity(Gravity.CENTER); 

     WindowManager mWinMgr; 
     mWinMgr = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); 
     int displayWidth = mWinMgr.getDefaultDisplay().getWidth(); 

     warning.getWindow().setLayout(displayWidth - 75, 
       LayoutParams.WRAP_CONTENT); 
     warning.setOnDismissListener(new OnDismissListener() { 
      public void onDismiss(DialogInterface dialog) { 
       Log.i(TAG, "Inside Dialog interface"); 
       // test = true; 
       warning.dismiss(); 
      } 
     }); 
     ListView listinterest = (ListView) warning 
       .findViewById(R.id.list_catagory); 
     /* 
     * ArrayList<String> count = new ArrayList<String>(); count.clear(); 
     * count.add("Hotels"); count.add("Restaurants"); count.add("Gardens"); 
     * count.add("Theater"); 
     */ 
     CatagorySummaryAdapter adapter; 
     adapter = new CatagorySummaryAdapter(YOUR_ACTIVITY.this, 
       YOUR_ARRAYLIST_OF_CATAGORY, true); 

     listinterest.setAdapter(adapter); 

     Button btnOk = (Button) warning.findViewById(R.id.btn_close); 
     btnOk.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       // TODO Auto-generated method stub 

       String Catagory = ""; 
       int count = HomeActivity.acceptpositionwhoesNearMe.size(); 

       if (count > 0) { 
        for (int i = 0; i < HomeActivity.acceptpositionwhoesNearMe 
          .size(); i++) { 

         int pos = Integer 
           .parseInt(HomeActivity.acceptpositionwhoesNearMe 
             .get(i)); 
         if (Catagory.equals("")) { 
          Catagory = GetUserDetailsJsonParser.CategoryName 
            .get(pos); 
          HomeActivity.AcceptCatagotyIDWhoesNearMe = GetUserDetailsJsonParser.CategoryID 
            .get(pos); 
         } else { 

          Catagory = Catagory 
            + "," 
            + GetUserDetailsJsonParser.CategoryName 
              .get(pos); 
          HomeActivity.AcceptCatagotyIDWhoesNearMe = HomeActivity.AcceptCatagotyIDWhoesNearMe 
            + "," 
            + GetUserDetailsJsonParser.CategoryID 
              .get(pos); 
         } 

        } 

        Log.i(TAG, "Accept Catagory IDs WhoseNear Me" 
          + HomeActivity.AcceptCatagotyIDWhoesNearMe); 

        GetUserDetailsJsonParser.InterestedIn = HomeActivity.AcceptCatagotyIDWhoesNearMe; 
        UpdateMap = true; 
        /* 
        * startActivity(new Intent(WhosNearMe.this, 
        * BuildInukshk_4.class)); 
        */ 
        new GetUsersInRadiusAsyncTask().execute(); 

        warning.dismiss(); 

       } else { 
        Toast.makeText(WhosNearMe.this, 
          "Please Select One or More Catagory", 3).show(); 
       } 
       // test = true; 

      } 
     }); 

     warning.show(); 
    } 

Đây là logout_dialogue.xml My:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/edittext_back_final" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:id="@+id/linearLayout1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" > 

     <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" > 

      <com.inukshk.CustomTextViewBold 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginLeft="10dp" 
       android:layout_marginTop="10dp" 
       android:text="Interested in" 
       android:textColor="#3C3C3C" 
       android:textSize="18sp" 
       android:textStyle="bold" /> 
     </LinearLayout> 

     <ListView 
      android:id="@+id/list_catagory" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_marginLeft="10dp" 
      android:layout_marginTop="10dp" 
      android:layout_weight="1" 
      android:cacheColorHint="#00000000" 
      android:divider="@android:color/transparent" > 
     </ListView> 

     <Button 
      android:id="@+id/btn_close" 
      android:layout_width="99dp" 
      android:layout_height="40dp" 
      android:layout_alignParentLeft="true" 
      android:layout_marginLeft="10dp" 
      android:background="@drawable/btn_back_final" 
      android:text="CLOSE" 
      android:textColor="#ffffff" 
      android:textSize="16dp" 
      android:textStyle="bold" /> 
    </LinearLayout> 

</LinearLayout> 

đây là My CatagorySummaryAdapter.java:

package com.inukshk.adapter; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.content.Context; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 

import com.inukshk.HomeActivity; 
import com.inukshk.R; 
import com.inukshk.CreateInukshk.BuildInukshk_3; 
import com.inukshk.WhosNearMe.WhosNearMe; 

public class CatagorySummaryAdapter extends BaseAdapter { 

    public Activity context; 
    String TAG = "CatagorySummaryAdapter"; 
    public LayoutInflater inflater; 
    public ArrayList<String> Count; 
    boolean Dialogue; 

    public CatagorySummaryAdapter(Activity context, ArrayList<String> Count, 
      boolean Dialogue) { 
     super(); 
     this.context = context; 
     this.inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     this.Count = Count; 

     this.Dialogue = Dialogue; 

     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return Count.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return Count.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    public class ViewHolder { 
     RelativeLayout lsummary_row; 
     TextView txtinterestname; 
     CheckBox chkinterest; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     int pos = position; 
     ViewHolder holder; 

     if (convertView == null) { 
      holder = new ViewHolder(); 

      if (Dialogue) { 
       convertView = inflater.inflate(
         R.layout.listview_summary_dialogue_row, null); 
      } else { 
       convertView = inflater.inflate(R.layout.listview_summary_row, 
         null); 
      } 

      holder.txtinterestname = (TextView) convertView 
        .findViewById(R.id.txtinterestname); 
      holder.lsummary_row = (RelativeLayout) convertView 
        .findViewById(R.id.lsummary_row); 
      holder.chkinterest = (CheckBox) convertView 
        .findViewById(R.id.chkinterest); 
      holder.chkinterest.setEnabled(true); 

      holder.chkinterest.setTag(position); 

      if (Dialogue) { 

       for (int i = 0; i < HomeActivity.acceptpositionwhoesNearMe.size(); i++) { 
        int index = Integer 
          .parseInt(HomeActivity.acceptpositionwhoesNearMe 
            .get(i)); 
        // Log.i(TAG, "Inside for Loop of Accept Positions"); 
        if (index == position) { 
         // Log.i(TAG, "Matched for index" + index); 
         holder.chkinterest.setChecked(true); 
         holder.chkinterest 
           .setButtonDrawable(R.drawable.checkbox_checked); 
        } 

       } 

      } else { 
       for (int i = 0; i < BuildInukshk_3.acceptposition.size(); i++) { 
        int index = Integer.parseInt(BuildInukshk_3.acceptposition 
          .get(i)); 
        // Log.i(TAG, "Inside for Loop of Accept Positions"); 
        if (index == position) { 
         // Log.i(TAG, "Matched for index" + index); 
         holder.chkinterest.setChecked(true); 
         holder.chkinterest 
           .setButtonDrawable(R.drawable.checkbox_checked); 
        } 

       } 
      } 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.chkinterest 
       .setOnCheckedChangeListener(new OnCheckedChangeListener() { 

        @Override 
        public void onCheckedChanged(CompoundButton buttonView, 
          boolean isChecked) { 
         // TODO Auto-generated method stub 
         // Log.i(TAG, "ISChecked is " + isChecked); 
         if (isChecked) { 
          // Log.i(TAG, "ISChecked is true"); 
          buttonView 
            .setButtonDrawable(R.drawable.checkbox_checked); 
          int position = Integer.parseInt(buttonView.getTag() 
            .toString()); 
          if (Dialogue) { 
           HomeActivity.acceptpositionwhoesNearMe.add(String 
             .valueOf(position)); 

           Log.i(TAG, "Accept ID of Dialogue" 
             + HomeActivity.acceptpositionwhoesNearMe); 
          } else { 
           BuildInukshk_3.acceptposition.add(String 
             .valueOf(position)); 

           Log.i(TAG, "Accept ID" 
             + BuildInukshk_3.acceptposition); 
          } 

         } else { 
          // Log.i(TAG, "ISChecked is false"); 
          buttonView 
            .setButtonDrawable(R.drawable.checkbox_unchecked); 
          int position = Integer.parseInt(buttonView.getTag() 
            .toString()); 

          if (Dialogue) { 
           if (HomeActivity.acceptpositionwhoesNearMe 
             .contains(String.valueOf(position))) { 
            // Log.i(TAG, 
            // "Inside Already present position"); 
            HomeActivity.acceptpositionwhoesNearMe 
              .remove(String.valueOf(position)); 
            Log.i(TAG, 
              "Accept ID Dialogue***" 
                + HomeActivity.acceptpositionwhoesNearMe); 
           } 
          } else { 
           if (BuildInukshk_3.acceptposition 
             .contains(String.valueOf(position))) { 
            // Log.i(TAG, 
            // "Inside Already present position"); 
            BuildInukshk_3.acceptposition.remove(String 
              .valueOf(position)); 
            Log.i(TAG, "Accept ID ***" 
              + BuildInukshk_3.acceptposition); 
           } 
          } 
          // 
         } 

        } 
       }); 

     holder.txtinterestname.setText(Count.get(pos)); 

     return convertView; 
    } 

} 

cố gắng để đi qua nó có thể giúp bạn.

+0

isnt nó có thể sử dụng setMultiChoiceItems với DialogFragments? –

+0

@HarshaMV: Tôi chưa sử dụng SherlockDialogFragment. vì vậy không thể đưa ra đề xuất chính xác cho bạn. thật sự xin lỗi. –

+0

không sao cả. Bạn có thể chia sẻ mã thực hiện để chọn tất cả và bỏ chọn tất cả. Chỉ cần u đề cập đến đã đạt được điều này. tôi nghĩ rằng chúng ta có thể dễ dàng chuyển mã ur sang DialogFragment –

0

Tôi cũng muốn tiếp tục sử dụng setMultiChoiceItems() với thoại của tôi, vì vậy thay vì tạo một hộp thoại tùy chỉnh, tôi đã làm điều này:

Đừng trả lại AlertDialog ngay lập tức. Tạo AlertDialog.Builder nó lần đầu tiên như thế này:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

Đặt thông số xây dựng của bạn:

builder.setTitle(listTitle) 
.setMultiChoiceItems(allTagsArray, containsTag, 
      new DialogInterface.OnMultiChoiceClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which, boolean isChecked){ 

Sau đó tạo các AlertDialog tự gọi create(). Điều này sẽ không hiển thị hộp thoại.

AlertDialog dialog = builder.create();

Sau đó lấy ListView, thêm một header và/hoặc chân trang, và gửi lại.

ListView dialogList = dialog.getListView(); 
dialogList.addFooterView(yourHeader); 
return dialog; 

Điều này cũng hoạt động với tổng số ba không gian tùy chỉnh mà không cần phải triển khai bộ điều hợp tùy chỉnh. Nhược điểm duy nhất có thể cho điều này đối với một số là các đầu trang và chân trang cuộn với danh sách (chỉ có vấn đề nếu danh sách dài hơn màn hình, rõ ràng).

Hy vọng điều này sẽ hữu ích.

Cập nhật quan trọng: Không sử dụng tiêu đề trong danh sách hộp kiểm. Nó gây ra AlertController.java để tính toán sai số hộp kiểm nào được chọn, khiến nó vô dụng. Chân trang vẫn có thể được sử dụng, điều này rất hữu ích trong trường hợp này, nhưng không phải trong trường hợp của tôi, vì vậy tôi đang tạo một hộp thoại tùy chỉnh.