2012-12-13 5 views
9

Voglio creare un modo gli utenti possono selezionare le opzioni come l'immagine qui sottodialogo personalizzata con setMultiChoiceItems

enter image description here

In questo momento sto facendo la seguente

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); 
     } 
    } 

} 

Ma voglio aggiungere opzione ALL come l'immagine Quindi penso che dovrò costruire un dialogo personalizzato. Posso comunque estendere il setMultiChoiceItems nativo in modo che riduca la mia gestione del codice.

+0

Il 'Builder' ha un metodo' setCustomTitle (View) '. – Luksprog

+0

@Luksprog deve avere una casella di controllo. come mostrato nell'immagine. così quando clicco voglio controllare o deselezionare tutto il contenuto all'interno del contenuto della finestra di dialogo. –

+0

Fornisci una vista a quel metodo che contiene un 'TextView' (il titolo attuale) e il' tutto' 'CheckBox'. – Luksprog

risposta

9

Probabilmente si può utilizzare il metodo della classe AlertDialog.BuildersetCustomTitle() e costruire il proprio titolo che ha il testo del titolo e anche l'tuttoCheckBox, qualcosa di simile:

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

dove R.layout.custom_title è:

<?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> 

Altre modifiche di stile devono essere apportate per migliorare l'aspetto. Ma vedendo l'intero layout della finestra di dialogo potresti voler andare con una classe personalizzata Dialog, per la quale il metodo setMultiChoice() non sarà disponibile (ma alla fine sarà facile replicarlo).

+0

Il metodo getLayoutInflater (Bundle) nel tipo DialogFragment non è applicabile per gli argomenti() –

+0

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

+0

Ho fatto quanto sopra e ho implementato il mio titolo personalizzato ma come posso ottenere i valori da gli oggetti? findViewById non funziona:/ –

2

Ho raggiunto la cosa che si sta visualizzando nell'immagine. quello che ho usato è stato il dialogo personalizzato come stai pensando di usare. avevo usato Listview all'interno del file xml.

Prima di tutto, definire l'inizializzazione dell'array.

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

riportano di seguito le Codice showDialog() ho usato.

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(); 
    } 

Ecco mio logout_dialogue.xml:

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

ecco la mia 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; 
    } 

} 

cercare di passare attraverso di essa potrebbe aiutare.

+0

non è possibile utilizzare setMultiChoiceItems con DialogFragments? –

+0

@HarshaMV: non ho ancora usato SherlockDialogFragment. quindi non sono in grado di darti un suggerimento corretto. veramente dispiaciuto. –

+0

nessun problema. Puoi condividere il codice fare per selezionare tutto e deselezionare tutto anche. Mi hai appena detto che l'hai raggiunto. Penso che possiamo facilmente portare il tuo codice a DialogFragment –

0

volevo anche continuare ad usare setMultiChoiceItems() con la mia finestra, così invece di creare una finestra di dialogo personalizzata, ho fatto questo:

non restituiscono il AlertDialog immediatamente. Creare la AlertDialog.Builder per primo in questo modo:

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

impostare i parametri costruttore:

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

quindi creare il AlertDialog si fa chiamare create(). Questo non mostrerà ancora il dialogo.

AlertDialog dialog = builder.create();

quindi ottenere il ListView, aggiungere un'intestazione e/o piè di pagina, e lo restituisce.

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

funziona questo anche con @ di Luksprog setCustomTitle() dandovi un totale di tre spazi personalizzabili senza dover implementare un adattatore personalizzato. L'unico svantaggio possibile per alcuni è che le intestazioni e i piè di pagina scorrono con la lista (il che è solo problematico se la lista è più lunga dello schermo, ovviamente).

Spero che questo aiuti.

Importante Aggiornamento: Non utilizzare le intestazioni in un elenco di caselle di controllo. Fa sì che AlertController.java calcoli male la casella di controllo, rendendola inutile. È comunque possibile utilizzare un piè di pagina, che è utile in questo caso, ma non nel mio caso, quindi sto costruendo una finestra di dialogo personalizzata.