2011-08-16 11 views
7

「追加/削除」オプションが付いたオプションメニューがあります。このオプションをクリックすると、チェック可能なリストが表示されます。現在持っているコードの問題は、一度に1つのアイテムしか選択できず、メニューが消えることです。リストの複数の項目を一度にチェックすることができ、ユーザーが画面上の別の場所にタッチするまで消えないようにしたい。これどうやってするの?Androidのサブメニューで複数のチェックボックスを選択するにはどうすればよいですか?

<?xml version="1.0" encoding="UTF-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/select_options" 
      android:title="Add/Remove"> 
     <menu> 
      <group android:checkableBehavior="all"> 
       <item android:id="@+id/A" 
         android:checked="true" 
         android:title="Option One" /> 
       <item android:id="@+id/B" 
         android:checked="true" 
         android:title="Option Two" /> 
      </group> 
     </menu> 
    </item> 
</menu> 

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

@Override 
public boolean onOptionsItemSelected(MenuItem item){ 
    switch (item.getItemId()){ 
    case R.id.A: 
     item.setChecked(!item.isChecked()); 
     return true; 
    case R.id.B: 
     item.setChecked(!item.isChecked()); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 
+0

万が一、それを把握しましたか?私は同じを探しています – Waqas

答えて

6

こんにちはTheBeatlemaniac:ここで私が持っているものの一般的なアイデアです!

何を求めていることはなんとかですかどうかは正直わかりません(EDIT:あなたは、サブメニューとして、それを実装している方法で):

が、私はそれをこのように行われているだろう、と表示するサブメニューのようなアクティビティを作成します。

もう少し複雑に思えるかもしれませんが、このように項目を選択/選択解除すれば消えず、さらに多くの機能を実装できます。ここで

は、私は個人的にそれを行っていた方法は次のとおりです。


  • サブメニュー項目を表すクラスを作成します。文字列(説明)とブール値(チェックされているかどうかを格納する)を含んでいなければなりません。
public class SettingCheckBox implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private static final String DEFAULT_DESCRIPTION = "N/A"; 

    private final String description; 

    private boolean checked; 

    public String getDescription() { 
     return description == null ? DEFAULT_DESCRIPTION : description; 
    } 

    public void setChecked (final boolean checked) { 
     this.checked = checked; 
    } 

    public boolean getChecked() { 
     return checked; 
    } 

    public SettingCheckBox (final String description) { 
     this.description = description; 
    } 

} 

あなたが見ることができるように、そのクラスのオブジェクトが別の使用の意図/バンドルへの活動から渡すことができるように、クラスがSerializableを実装します。

  • (あなたがそれを試しながら、自分の活動名でMainActivityを交換するので、私は、それはMainActivityと呼ばれていると仮定)あなたの現在の活動に次の行を追加します。
public static final String SETTING_CHECK_BOX = "SETTING_CHECK_BOX"; 

private ArrayList <SettingCheckBox> settingList; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    // ... 
    settingList = new ArrayList <SettingCheckBox>(); 
    settingList.add (new SettingCheckBox ("Option A")); 
    settingList.add (new SettingCheckBox ("Option B")); 
    // ... add more items 
    // restore any previously saved list 
    if (savedInstanceState != null) { 
     settingList = (ArrayList <SettingCheckBox>) savedInstanceState.getSerializable (SETTING_CHECK_BOX); 
    } 
    // ... 
} 

protected void onSaveInstanceState (Bundle outState) { 
    super.onSaveInstanceState (outState); 
    outState.putSerializable (SETTING_CHECK_BOX , settingList); 
} 

リスト(ArrayListの)は、チェックボックスですべての設定サブメニュー項目をホストするために使用されます。 ご覧のとおり、それぞれSettingCheckBoxオブジェクトには説明と状態(チェック済みまたはチェックなし)があります。デフォルトでは、作成後、オブジェクトの状態はで、チェックされていないのはです。 の上にリストを初期化する必要があります。メソッドを作成してください。

静的および最終可変SETTING_CHECK_BOXは(画面の回転のような)活性レクリエーション/後/保存前にそのリストの内容を復元するためのキーとして使用され、また別のアクティビティからの設定のリストを渡します。メニューxmlファイルは次のようになりますように

  • することは、あなたのサブメニューを削除する(後に説明):
<?xml version="1.0" encoding="UTF-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/select_options" 
     android:title="Add/Remove"> 
    </item> 
</menu> 

もはやサブメニューのための必要性無しあなたが活動を実施しますので、その1のように働く。 さて、設定が表示されます活動にメニュー項目をリンクするために、あなたははこのようにあなたの現在の活動の内側方法をonOptionsItemSelected使用する必要があります。設定の活動は結果のために開始され

@Override 
public boolean onOptionsItemSelected (MenuItem menuItem) { 
    if (menuItem.getItemId() == R.id.select_options) { 
     Intent intent = new Intent (this , MyActivity_Settings.class); 
     intent.putExtra (SETTING_CHECK_BOX , settingList); 
     startActivityForResult (intent , 0); 
    } 
} 

。つまり、子アクティビティのように動作し、の親アクティビティに結果を返します。

設定リストは、インテント経由で設定アクティビティに渡されます。

子アクティビティが親アクティビティにデータを終了して戻ると、以下のメソッドが呼び出されます。

protected void onActivityResult (int requestCode , int resultCode , Intent data) { 
    if (resultCode != RESULT_OK || data == null) 
     return; 
    settingList = (ArrayList <SettingCheckBox>) data.getSerializableExtra (SETTING_CHECK_BOX); 
} 

あなたは子供/設定の活動をしなければならない、設定の(新規/変更)のリストを返し、上記のように、新しいリストが設定されます。

  • sub_menuと呼ばれる以下のレイアウトxmlファイルを作成します。これは、あなたのサブメニューとして機能する活動のレイアウトである
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 

</LinearLayout> 

を。実際にはリスト・アクティビティで、必要なだけ多くのオプションを保持できます(上のアクティビティで宣言された配列リストに追加するだけです)。

  • sub_menu_itemと呼ばれる以下のレイアウトxmlファイルを作成します。これは、リスト内の各列のレイアウトである
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:gravity="center_vertical" > 

    <TextView 
     android:id="@+id/option_title" 
     android:layout_width="0dip" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:textAppearance="@android:style/TextAppearance.Medium" /> 

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

</LinearLayout> 

を、テキストビューとチェックボックスは、ちょうどサブのような(あり既に使用していたメニュー)。

  • には、次のものが含まれている必要があり、新しいクラスと題しMyActivity_Settingsを作成します:
public class MyActivity_Settings extends ListActivity { 

    private ArrayList <SettingCheckBox> settingList; 

    @Override 
    public void onCreate (Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView (R.layout.sub_menu); 
     setTitle ("Add/Remove"); 
     settingList = getIntent().getSerializableExtra (MainActivity.SETTING_CHECK_BOX); 
     if (savedInstanceState != null) { 
      settingList = (ArrayList <SettingCheckBox>) savedInstanceState.getSerializable (MainActivity.SETTING_CHECK_BOX); 
     } 
     setListAdapter (new MyActivity_Settings_Adapter (this , R.layout.item_layout , settingList)); 
    } 

    protected void onSaveInstanceState (Bundle outState) { 
     super.onSaveInstanceState (outState); 
     outState.putSerializable (MainActivity.SETTING_CHECK_BOX , settingList); 
    } 

    @Override 
    public void finish() { 
     setResult (RESULT_OK , new Intent().putExtra (MainActivity.SETTING_CHECK_BOX , settingList)); 
     super.finish(); 
    } 

} 

class MyActivity_Settings_Adapter extends ArrayAdapter <SettingCheckBox> { 

    private final LayoutInflater layoutInflater; 
    private final int itemResourceId; 

    // Holder pattern (used instead of findViewById for better performance) 
    static class ViewHolder { 
     public TextView title; 
     public CheckBox checkBox; 
    } 

    // Constructor 
    public MyActivity_Settings_Adapter (ListActivity context, int itemResourceId , List <SettingCheckBox> options) { 
     super (context , itemResourceId , options); 
     layoutInflater = context.getLayoutInflater(); 
     this.itemResourceId = itemResourceId; 
    } 

    // Method called by the list view every time to display a row 
    @Override 
    public View getView (int position , View convertView , ViewGroup parent) { 
     // Declare and initialize the row view 
     View rowView = convertView; 
     // Declare the row view holder 
     ViewHolder viewHolder; 
     // Check if an inflated view is provided 
     if (rowView == null) { 
      // A new view must be inflated 
      rowView = layoutInflater.inflate (itemResourceId , null); 
      // Declare and initialize a view holder 
      viewHolder = new ViewHolder(); 
      // Retrieve a reference to the row title 
      viewHolder.title = (TextView) rowView.findViewById (R.id.option_title); 
      // Retrieve a reference to the row check box 
      viewHolder.checkBox = (CheckBox) rowView.findViewById (R.id.option_checkbox); 
      // Store the view holder as tag 
      rowView.setTag (viewHolder); 
     } // End if 
     else 
     // An inflated view is already provided, retrieve the stored view holder 
     viewHolder = (ViewHolder) rowView.getTag(); 

     // Set the option title 
     viewHolder.title.setText (getItem (position).getDescription()); 
     // Set the option check box state 
     viewHolder.checkBox.setChecked (getItem (position).getChecked()); 
     // Assign a click listener to the checkbox 
     viewHolder.checkBox.setOnClickListener(new OnClickListener() { 

      public void onClick (View checkBox) { 
       // Retrieve the stored view holder 
       ViewHolder viewHolder = (ViewHolder) ((View) checkBox.getParent()).getTag(); 
       // Update the option state 
       getItem (position).setChecked (! getItem (position).getChecked()); 
       // Display the new option state 
       viewHolder.checkBox.setChecked (getItem (position).getChecked()); 
      } 
     }); 

     // Return the row view for display 
     return rowView; 
    } // End of getView 

} 

このクラスは、サブメニューとして機能する活動を表します。私が前に言ったように、それはリストアクティビティです(したがって、ListActivityを拡張する必要があります)。リスト内のさまざまなオプションを表示するには、アダプタ(この場合は配列アダプタで十分です)が必要です。これは、MyActivity_Settings_Adapterクラス(ArrayAdapterを継承します)の役割です。

リストアクティビティが終了した場合(ユーザーが戻るボタンをクリックするか、ダイアログとして表示されるアクティビティの外の場所)、親アクティビティに新しいアクティビティリストが返されます値。

アダプタはリストを表示するために各行を作成します。 さらに、アダプターはすべてのチェックボックスにクリックリスナーを割り当てます。そのため、チェックされている(またはチェックされていない)場合、オプションはそれに応じて変更されます。

サブメニューの外の場所をクリックするか、単に戻るボタンを押すと、サブメニューが表示されなくなり、メインのアクティビティのブール配列にユーザーの選択が保存されます。

ListActivityとArrayAdapterに慣れていない場合は、tutorialが大いに役立ちます。

  • (アプリケーションタグ内)AndroidマニフェストXMLファイルでこれを追加することを忘れないでください:
<activity android:name=".MyActivity_Settings" 
     android:theme="@android:style/Theme.Dialog" /> 

テーマは(@android:スタイル/ Theme.Dialog)が適用されるようになりますアクティビティはサブメニューのように見えます。

希望すると助かります! 私はそれを試して、それは完全に動作します!それを試して、何が起こるか教えてください。

+0

素晴らしい答え.. –

+0

恐ろしい男!!!! – ngoa

+0

素晴らしい!上記のコードを使用していますが、戻るボタンを押したとき、または親アクティビティに戻るときにチェックされたアイテムのリストを取得するにはどうすればよいですか? – choman

関連する問題