2011-05-12 9 views
14

Onay kutularıyla iletişim kurabilirim ve seçenekler seçildiğinde ve ne zaman tıklatıldığında farklı şeyler yapmaya çalışıyordum. Bazı öğreticiler okuduktan sonra ne yaptığımı bildiğimi sanıyordum, ama tamam bastığımda, kontrol edilmese bile "Her şey" tost. Öyle görünüyor ki eğer ifadeler doğru çalışmıyorsa, ama nedenini bilmiyorum.Android Checkbox İletişim Kutusu (Kolay)

Neyi yanlış yaptığım ve nasıl düzeltileceği ile ilgili herhangi bir öneri çok takdir edilecektir!

final CharSequence[] items = {"Item 1", "Item 2", "Item 3"}; 
    final boolean[] states = {false, false, false}; 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle("What would you like to do?"); 
    builder.setMultiChoiceItems(items, states, new DialogInterface.OnMultiChoiceClickListener(){ 
     public void onClick(DialogInterface dialogInterface, int item, boolean state) { 
     } 
    }); 
    builder.setPositiveButton("Okay", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      SparseBooleanArray CheCked = ((AlertDialog)dialog).getListView().getCheckedItemPositions(); 
      if(CheCked.get(CheCked.keyAt(0)) == true){ 
       Toast.makeText(Backup.this, "Item 1", Toast.LENGTH_SHORT).show(); 
      } 
      if(CheCked.get(CheCked.keyAt(1)) == true){ 
       Toast.makeText(Backup.this, "Item 2", Toast.LENGTH_SHORT).show(); 
      } 
      if(CheCked.get(CheCked.keyAt(2)) == true){ 
       Toast.makeText(Backup.this, "Item 3", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      dialog.cancel(); 
     } 
    }); 
    builder.create().show(); 
} 

cevap

7

sorun

indexth anahtarı döndüren API Dokümanlar göre, hangi, keyAt kullanmasıdır Bu SparseBooleanArray depolarının anahtar-değer eşlemesi.

ve bu SparseBooleanArray listenizde (getCheckedItemPositions) sadece işaretli öğeleri içerir!

Yani üç kişilik iki öğeleri kontrol, sonra CheCked üyesi 2 öğe içerecek ve keyAt(2) çağırdığınızda (o pozisyonda haritası değerini tutmaz olsa değil IndexOutOfBoundsException) 0 döndürecektir.

builder.setPositiveButton("Okay", new DialogInterface.OnClickListener() 
{ 
    public void onClick(DialogInterface dialog, int id) 
    { 
     SparseBooleanArray CheCked = ((AlertDialog) dialog).getListView().getCheckedItemPositions(); 
     if (CheCked.get(0)) 
     { 
      Toast.makeText(TmpActivity2.this, "Item 1", Toast.LENGTH_SHORT).show(); 
     } 
     if (CheCked.get(1)) 
     { 
      Toast.makeText(TmpActivity2.this, "Item 2", Toast.LENGTH_SHORT).show(); 
     } 
     if (CheCked.get(2)) 
     { 
      Toast.makeText(TmpActivity2.this, "Item 3", Toast.LENGTH_SHORT).show(); 
     } 
    } 
}); 

Ayrıca eğer maddenin == true bölümünü gevşek olabilir, ama bu sadece semantik var:

Ne kullanması gereken argümanlar olarak senin ListView gelen madde pozisyonları ile, sadece bu SparseBooleanArray ait get yöntemidir .

İade:
A SparseBooleanArrayget(int position)position yapılan her çağrı için de geçerli dönecektir Eğer getCheckedItemPositions yöntemin API Dokümanlar bir göz atacak olursak

, bu çözüm bulmak Seçim modu CHOICE_MODE_NONE olarak ayarlanmışsa, listedeki bir konumdur veya null.

+0

Her iki yöntemden de mükemmel teşekkürler Her iki yöntem de iyi çalışıyor – GFlam

+0

@rekaszenu Bence bu çözüm de daha iyi. Özellikle büyük listeler için. Loop daha fazla kaynağa ihtiyaç duyar. – evilone

+0

Geçici çözümlerden çok, api kullanarak her zaman daha iyidir, ancak çoğu durumda yalnızca belgeleri okumak sıkıcıdır; :) Bu 'CheCked' üyesi' ListView' öğeleri ve kontrol durumlarının tam bir 'Harita' olarak ele alınarak sonuçlanır. – rekaszeru

10

Ben mesela böyle yapardı:

public class Main extends Activity { 

    CharSequence[] items = {"Google", "Apple", "Microsoft"}; 
    boolean[] itemsChecked = new boolean[items.length]; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Button btn = (Button) findViewById(R.id.btnDialog); 
     btn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       showDialog(0); 
      } 
     }); 
    } 

    @Override 
    protected Dialog onCreateDialog(int id) { 
     switch (id) { 
     case 0: 
      return new AlertDialog.Builder(this) 
      .setIcon(R.drawable.icon) 
      .setTitle("Dialog with simple text") 
      .setPositiveButton("OK", new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        for (int i = 0; i < items.length; i++) { 
        if (itemsChecked[i]) { 
         Toast.makeText(getBaseContext(), items[i] + " checked!", Toast.LENGTH_LONG).show(); 
        } 
       } 
       } 
      }) 
      .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        Toast.makeText(getBaseContext(), "Cancel clicked!", Toast.LENGTH_LONG).show(); 
       } 
      }) 
      .setMultiChoiceItems(items, itemsChecked, new DialogInterface.OnMultiChoiceClickListener() { 

       @Override 
       public void onClick(DialogInterface dialog, int which, boolean isChecked) { 
        Toast.makeText(getBaseContext(), items[which] + (isChecked ? "checked!" : "unchecked!"), Toast.LENGTH_SHORT).show(); 
       } 
      }) 
      .create(); 
     } 

     return null; 
    } 


} 
+0

Bazı şeylerin çalışmasını istemiyorum, ancak tamam tıklandığında çalışıp çalışmadığının kontrol edilmesini istediğinizi seçerim ve yalnızca tamam tuşuna basıldığında öğeyi çalıştıramıyor – GFlam

+1

kodumu düzenledim, ancak sizden biraz daha zor düşün.OnClick yöntemi için döngü eklemek çok zor değil ve hangi dizi öğesinin gerçek değerine sahip olduğunu kontrol edin :) – evilone

+0

Üzgünüz, bu yeni zaman için boş zamanlarımda java öğreniyorum, ama yine de cehennem gibi yoruldum. lol da son birkaç saat mola süresi için bu app gidiyordu :) ama yöntem sadece benim için kontrol vermişti çünkü sadece benim için onay verdi çünkü daha önce benim kod olarak vardı ve ne ben açıkladı Ben size hem çekler vermek olabilir yanlış bir dilek yapmıştı ama ben de bir oy verdi ben de – GFlam

2

bu başka sınıfta İşaretli öğeleri kullanmak nasıl ardından

.setMultiChoiceItems(items, itemsChecked, 
         new DialogInterface.OnMultiChoiceClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, 
            int which, boolean isChecked) { 




           Toast.makeText(
             getBaseContext(), 
             items[which] 
               + (isChecked ? " checked!" 
                 : " unchecked!"), 
             Toast.LENGTH_SHORT).show(); 
          } 
         }) 

Ama yardımcı olmalıdır?