2011-05-12 5 views
14

확인란이있는 대화 상자가 있는데 옵션을 선택하고 확인을 누르면 다른 작업을 시도하고있었습니다. 나는 내가 자습서를 읽은 후에 내가 뭘하는지 알았다고 생각했지만, 나는 그것을 확인하지 않고 그냥 "모든 것"이라고 말하면 좋다. 그래서 if 문이 제대로 작동하지 않는 것 같지만 왜 그럴지 모르겠습니다.Android 체크 박스 대화 상자 (쉬운)

내가 뭘 잘못하고 어떻게 고칠 지에 대한 제안은 크게 감사하겠습니다!

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

답변

7

을 문제는 당신이

이 indexth 에서 키를 돌려 API 문서 도구에 따라하는, keyAt를 사용한다는 것입니다 이 SparseBooleanArray가 저장하는 키 - 값 매핑.

SparseBooleanArray에는 목록의 체크 된 항목 (getCheckedItemPositions) 만 포함되어 있습니다!

그래서 당신은 세 가지의 두 항목을 선택하면, 다음 CheCked 회원은이 개 항목이 포함되며, 당신이 keyAt(2)를 호출 할 때 (그 위치에있는지도가 값을 보유하지 않습니다하지만,하지 IndexOutOfBoundsException)는 0을 반환합니다.

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

당신은 또한 만약 조항의 == true 부분을 풀 수 있지만, 그건 그냥 의미입니다 :

은 당신이 사용해야하는 것은 인수로 당신의 ListView에서 항목 위치와 함께, 단순히이 SparseBooleanArrayget 방법 .

반환 :
SparseBooleanArrayget(int position)position 각 호출에 대해 true를 반환합니다 당신이 getCheckedItemPositions 방법의 API 문서 도구을 살펴 경우

,이 해결책을 찾기 선택 모드가 CHOICE_MODE_NONE으로 설정된 경우 목록의 위치이거나 null입니다.

+0

두 분 모두의 완벽한 감사 덕분에 잘 작동합니다. – GFlam

+0

@rekaszenu이 솔루션이 더 좋다고 생각합니다. 특히 큰 목록의 경우. 루프에는 더 많은 리소스가 필요합니다. – evilone

+0

API를 사용하는 것이 항상 (거의) 항상 더 나은 방법이지만, 대부분의 경우 문서를 읽는 것만으로 지루합니다. :) 이것은'CheCked' 멤버를'ListView'의 항목들과 체크 된 상태의 전체'Map'으로 처리하게됩니다. – rekaszeru

10

나는 예를 들어 이런 식으로 할 것 :

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

나는 onClick을 실행하고 싶지 않습니다. 괜찮은 것을 눌렀을 때만 실행되도록 선택했는데 okay를 눌렀을 때만 실행할 수 있습니다. onClick을 실행할 수 없습니다. – GFlam

+1

내 코드를 편집했으나 더 열심히 생각하십시오.onClick 메서드에 for 루프를 추가하고 어떤 배열 항목이 true 값을 가지고 있는지 확인하는 것은 그리 어렵지 않습니다. :) – evilone

+0

미안하지만 지난 달 내 여가 시간에 Java를 배우는 것이 처음 이었지만 어쨌든 지옥처럼 지쳤습니다. 뿐만 아니라 지난 몇 시간 동안이 응용 프로그램에 갈 LOL되었습니다 휴식 시간 :)하지만 당신의 방법은 다른 사람처럼 훌륭한 일을했습니다. 왜냐하면 내가 이미 내 코드로 그것을 가지고 있었고, 내가 너희들에게 두 수표를 줄 수 있었으면 좋겠다고 바랬지만, 투표까지했다. – GFlam

2

이 다른 클래스에서 선택한 항목을 사용하여 어떻게 다음

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

하지만 도움이해야합니까?