こんにちは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)が適用されるようになりますアクティビティはサブメニューのように見えます。
希望すると助かります! 私はそれを試して、それは完全に動作します!それを試して、何が起こるか教えてください。
万が一、それを把握しましたか?私は同じを探しています – Waqas