фонаGridView MultiChoiceModeListener не показано в фрагменте
У меня есть Activity
, содержащее уникальную Fragment
. Fragment
содержит GridView
, который отображает ряд элементов. Элементы реализуют проверяемый интерфейс, который меняет цвет фона в зависимости от их состояния и работает по назначению.
Теперь я хотел бы использовать MultiChoiceModeListener
для своих GridViewItem
.
Проблема в том, что я установил MultiChoiceModeListener
на GridView
, но он не отображается, когда я нажимаю на свои объекты в GridView
.
Код
Activity.java:
public class MainMenuActivity extends AppCompatActivity implements View.OnClickListener {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
Intent i = new Intent(this, SettingsActivity.class);
startActivity(i);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_menu);
setUpComponents();
}
private void setUpComponents(){
//Setting up buttons etc.
}
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(android.R.id.content, new ChoosePhotosFragment());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
}
Fragment.java:
public class ChoosePhotosFragment extends Fragment implements MediaStoreProvider.OnQueryResultListener, AdapterView.OnItemClickListener {
private GridView gridView;
private GridViewAdapter gridAdapter;
private ArrayList<GridViewObject> objects;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_choose_photos, container, false);
objects = new ArrayList<>();
gridView = (GridView) v.findViewById(R.id.gvChoosePhotos);
gridAdapter = new GridViewAdapter(getActivity(), objects);
gridView.setAdapter(gridAdapter);
gridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE);
gridView.setMultiChoiceModeListener(new MultiChoiceModeListener());
gridView.setOnItemClickListener(this);
getData();
return v;
}
public void getData() {
//Fetching and setting up the adapter with data.
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
System.out.println(gridView.isItemChecked(position));
}
public class MultiChoiceModeListener implements
GridView.MultiChoiceModeListener {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.setTitle("Select Items");
mode.setSubtitle("One item selected");
System.out.println("onCreateActionMode");
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return true;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
System.out.println("onActionItemClicked");
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position,
long id, boolean checked) {
System.out.println("onItemCheckedStateChanged");
int selectCount = gridView.getCheckedItemCount();
switch (selectCount) {
case 1:
mode.setSubtitle("One item selected");
break;
default:
mode.setSubtitle("" + selectCount + " items selected");
break;
}
}
}
}
GridViewItem.xml:
<com.marcusjacobsson.vault.widgets.CheckableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="@drawable/grid_item_background"
android:orientation="vertical"
android:padding="5dp">
<ImageView
android:id="@+id/image"
android:layout_width="100dp"
android:layout_height="100dp" />
<TextView
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:textSize="12sp" />
</com.marcusjacobsson.vault.widgets.CheckableLayout>
CheckableLayout.java:
public class CheckableLayout extends LinearLayout implements Checkable {
private boolean mChecked;
private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};
public CheckableLayout(Context context) {
super(context);
}
public CheckableLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CheckableLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked()) {
mergeDrawableStates(drawableState, CHECKED_STATE_SET);
}
return drawableState;
}
@Override
public void setChecked(boolean b) {
if (b != mChecked) {
mChecked = b;
refreshDrawableState();
}
}
public boolean isChecked() {
return mChecked;
}
public void toggle() {
setChecked(!mChecked);
}
}
Фоновый селектор моего CheckableLayout (Фон меняет цвет в зависимости от состояния CheckableLayout):
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" >
<!-- This applies when the item is checked. -->
<shape android:shape="rectangle" >
<solid android:color="#000" />
</shape>
</item>
<item>
<!-- This applies when the item is not checked. -->
<shape android:shape="rectangle" >
<solid android:color="#FFF" />
</shape>
</item>
</selector>
Наконец, GridView, который расположен в макете ChoosePhotosFragment:
<GridView
android:id="@+id/gvChoosePhotos"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:clickable="true"
android:columnWidth="100dp"
android:drawSelectorOnTop="true"
android:focusable="true"
android:gravity="center"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:verticalSpacing="5dp" />
Постановка задачи и вопрос
Как указано выше, когда я проверяю/нажимаю элемент в своем GridView
, я ожидаю, что MultiChoiceMode
перекрыт ActionBar
. В настоящее время это не так. MultiChoiceMode
не вызывается вообще (сообщения System.out
печатаются в журнале, и визуальный режим не отображается).
Я попытался следующие без успеха:
- Установка
ImageView
иTextView
в GridViewItem.xml кclickable="false"
иcheckable="false"
. - Изменение
GridView.CHOICE_MODE_MULTIPLE
кGridView.CHOICE_MODE_MULTIPLE_MODAL
(это не только не работает, , но и не останавливалоGridView
элементов из меняющегося фона, как будто они больше не изменились состояние)
Я не могу понять, что это неправильно, так мой вопрос просто; что случилось с моим кодом?