0

メニュー項目をクリックし、何かを行うための1つまたは複数の項目を選択するための複数の選択肢を持つ警告ダイアログを表示したい。 私はすでに別のチュートリアルから多くの例を試しましたが、本当に私のニーズに合ったものはありません。 タスクはここから開始します: main menu with task itemsメニューからlistitemsでAlertDialogを呼び出す

ユーザはメインアクティビティからメニューを開き、カテゴリを削除する項目を選択します。今まで

私はこのようなアラートダイアログが出ます: The alert dialog which pops up

MainActivityはこのように定義されています。ここ

public class MainActivity extends AppCompatActivity implements View.OnClickListener, 
    AdapterView.OnItemSelectedListener,SearchView.OnQueryTextListener,SearchView.OnCloseListener { 

は、オプションメニューのソースコードです:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.actions, menu); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.action_clear_all: 
      clearDoneItems(); 
      this.items_adapter.notifyDataSetChanged(); 
      break; 
     case R.id.action_select_all: 
      selectAllItems(); 
      this.items_adapter.notifyDataSetChanged(); 
      break; 

     case R.id.action_delete_done_items: 
      deleteDoneItems(); 
      break; 

     case R.id.action_delete_all: 
      deleteAllItems(); 
      break; 

     case R.id.action_add_category: 
      add_category(""); 
      break; 
     case R.id.action_delete_category: 
      del_category(); 
      break; 
    } 
    return super.onOptionsItemSelected(item); 
} 

これは、1つ以上の選択されたアイテムを削除するために呼び出す現在のメソッドです:

public void del_category() { 
    LayoutInflater li = LayoutInflater.from(MainActivity.this); 
    View dialogView = li.inflate(android.R.layout.select_dialog_multichoice, null); 

/* wb, 31Oct2017: preparation for list in delete categories */ 
    final ArrayList<Integer> sList = new ArrayList<Integer>(); 
    String[] delCats = new String[list_categories.size()]; 
    boolean iCount[] = new boolean[delCats.length]; 
    String msg =""; 
    for (int i = 0; i == list_categories.size(); i++) { 
     if (!list_categories.get(i).getSpinnerCategory().equals(" PLEASE SELECT A CATEGORY")) 
     {delCats[i] = list_categories.get(i).getSpinnerCategory();} 
    } 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setView(dialogView) 
      .setTitle("Delete categories") 
      .setMessage("Please select categories to be deleted") 
      .setMultiChoiceItems(delCats, iCount, new DialogInterface.OnMultiChoiceClickListener() { 
         @Override 
         public void onClick(DialogInterface arg0, int arg1, boolean arg2) { 
          if (arg2) { 
           sList.add(arg1); 
          } else if (sList.contains(arg1)) { 
           // if the item is already selected then remove it 
           sList.remove(Integer.valueOf(arg1)); 
          } 
         } 
        } 
      ) 
      .setCancelable(false) 
      .setPositiveButton 
        (
          "Yes", new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int which) { 
            Toast.makeText(MainActivity.this, "So far", Toast.LENGTH_SHORT).show(); 
           } 
          } 
        ) 
      .setNegativeButton 
        ("No", new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int which) { 
            Toast.makeText(MainActivity.this, "No Option Selected", Toast.LENGTH_SHORT).show(); 
           } 
          } 
        ); 
    //Creating dialog box 
    AlertDialog dialog = builder.create(); 
    dialog.show(); 
} 

私はAndroidプログラミングにとって非常に新しいので、すべてがうまくいきません。

私がリスト "delCats []"を記入する理由は、元のソース( "list_categories")で、XMLファイルから保存されたすべてのカテゴリがaから定義されていますクラス「CategoryTask.java」を作成しました。しかし、 "builder.setMultiChoiceItems()"メソッドは、最初のパラメータに対してこのような型を受け入れません。したがって、ループを使用してカテゴリをリスト "delCats"に引き継ぎます。

カテゴリの最初の項目( "PLEASE SELECT ...")は引き継がれません。実際のカテゴリではなく、アイテムを保存する前にユーザーがアイテムの正しいカテゴリを選択する必要があるため、既存のアイテムのみが存在します。

ここで誰かが私が間違っていたことを私に言わせてくれることを願っています。右のチェックボックスでカテゴリが表示されないのはなぜですか。私は見ることができる1つのチェックボックスをクリックすることさえできません。

デバッグセッション中、delCatのすべての項目が使用可能で、チェックボックスのすべての値がブール値配列 "icount"の "false"に設定されていることがわかります。

多くのおかげで、事前アンドレアスで

編集: 私はforループに変更。あなたは「delCats'と 『ICOUNTは』正しい方法で満たされている見ることができます。しかし、結果には変化残っていないので:。 enter image description here

編集2: は私がのために何か問題があることが表示されません私はそれをコメントから私の投稿への提案に変更したとしても、アプリケーションはクラッシュしています。

私は既に上記スクリーンショットでそれを示しました: ループは正常に動作しています。 delCatとiCountが正しく入力されているので、別の部分に問題があります。 enter image description here

デバッグでは、dialog.show()にはアプリケーションがクラッシュすることが示されています。ステートメント。 もう一つの興味深い点:私が実行時にdelCatsでfor-loopを使用している文字列配列を使用した場合、私はアラートを作成することができました。 タイプが異なる必要があると思いますが、理由は分かりません。そして出力は私が見たいと思ったものではありません。これはリストだけですが、チェックボックスはなく、1つのアイテムをクリックするだけです。 using a manual filled string array

あなたはまだいくつかの問題があると思っていますが、それでも解決策はありません。

答えて

0

あなたは、アダプタ内でリストを使用し、リストをsetMultiChoiceItemsではなく項目として設定することをお勧めします。

alertDialogを作成し、内部にlistItemを追加します。

AlertDialog.Builder alertBuilder = new AlertDialog.Builder(MainActivity.this); 
alertBuilder.setTitle("Select A Item "); 
alertBuilder.setItems(delCats, new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     String selectedText= Arrays.asList(value).get(which); 
     } 
}); 

AlertDialog dialog = alertBuilder.create(); 
dialog.show(); 

EDIT: あなたはそれをコーディング見ては、ループのための文字列配列が間違っていることは明らかです。 i == list_categories.size()はループを1回だけ実行し、最初のループを除いてアイテムを追加しません。

for (int i = 0; i == list_categories.size(); i++) 

変更i == list_categories.size()

for (int i = 0; i <= list_categories.size(); i++) 

EDITに2:あなたのコードに問題が再びはbounds.Youのうちloop.Theループのために与えているインデックスが使用する必要がありますいずれか

for (int i = 0; i <= list_categories.size(); i++) 

または

for (int i = 0; i < list_categories.size()-1; i++) 

ループは常に0から始まりますが、arraylistの最初の項目を指しています。i=list_categories.size()の場合、インデックスはarraylistの外にあり、bondエラーのインデックスをスローします。それをlist_categories.size()-1に変更します。

+0

多くのご意見ありがとうございます。私はその方法で投稿を編集する。 Forループは "<"ではなく "<"でのみ機能します。それは私がfirlst項目を取ることはありませんcozかもしれません。 サンプルコードが面白そうです。 Unfortunatelly私は "Array.asList(value)..."の "vale"に何を設定するか分からない。私にヒントを教えてください。 –

+0

あなたのコードの問題はforループで "=="でした。 "<="または "<"はあなたの問題を解決しているはずです。今はあなたのコードは大丈夫ですし、うまくいくはずです。あなたにはもう何か問題がありますか? – Anonymous

+0

はい、あります。私は長い間報道をしません。私がスクリーンショットをつけたので、ユーザーはメニュー項目をクリック/タッチし、警告がポップアップし、ユーザーは1つまたは複数のカテゴリーを選択し、次にポジティブボタンをクリックしてカテゴリーを削除する必要があります。現時点ではまだそれは以前のようなものです。それでも、 "Arrays.asList(value).get(which)"の "value"の意味を理解できません。 私のアプリは今のところ "dialog.show"となり、デバッガを実行する理由を見ることができません。ごめんなさい! –

関連する問題