Android drawSelectorOnTop с GridView

Я разрабатываю приложение с вкладками, в котором один из фрагментов CollectionsFragment содержит GridView с ImageView в каждом слоте. Я хотел бы использовать селектор, чтобы дать отзыв пользователям, когда пользователь нажимает на одно из изображений.

Я успешно реализовал селектор, однако моя проблема в том, что селектор только рисует на заднем плане изображения, но я бы хотел, чтобы селектор рисовал по всему изображению. Я видел эту проблему, упомянутую в другом месте, однако решение, выбранное многими, устанавливающее свойство drawSelectorOnTop GridView, не работает для меня.

Соответствующий фрагмент с соответствующим кодом адаптера:

public class CollectionsFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.activity_collections, container, false); // Grid view is inside the xml view inflated above GridView gridView = (GridView)view.findViewById(R.id.gridview); gridView.setDrawSelectorOnTop(true); ((GridView) gridView).setAdapter(new CustomGridViewAdapter(getActivity())); return view; } private class CustomGridViewAdapter extends BaseAdapter { @Override public View getView(int i, View view, ViewGroup viewGroup) { View v = view; ImageView picture; TextView name; if(v == null) { v = inflater.inflate(R.layout.collections_item, viewGroup, false); v.setTag(R.id.picture, v.findViewById(R.id.picture)); v.setTag(R.id.text, v.findViewById(R.id.text)); } picture = (ImageView)v.getTag(R.id.picture); name = (TextView)v.getTag(R.id.text); Item item = (Item)getItem(i); name.setText(item.name); picture.setImageResource(item.drawableId); picture.setBackgroundResource(R.drawable.selector); return v; } } } 

И мой селектор для полноты:

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@color/buttonhighlight"/> <!-- pressed state --> <item android:state_focused="true" android:drawable="@color/buttonhighlight"/> <!-- focused state --> <item android:drawable="@android:color/transparent"/> <!-- default state --> </selector> 

Спасибо за любую помощь,

Solutions Collecting From Web of "Android drawSelectorOnTop с GridView"

Я думаю, вы ошибаетесь в setDrawSelectorOnTop(boolean) . Выбираемый selector который делается ссылка, является внутренним selector GridView.

Даже в простейшей реализации GridView при щелчке элемента сетки вокруг него нарисована синяя рамка. Это связано с тем, что по умолчанию собственный элемент селекторного вида рисуется behind элементом. Если вы вызываете setDrawSelectorOnTop(true) , селектор (синий) будет нарисован поверх элемента.

Но setDrawSelectorOnTop(boolean) имеет ничего общего с селектором, который вы устанавливаете в адаптере. Если вы передадите true или false , поведение селектора ImageView не изменится.

Решение:

Вместо того, чтобы устанавливать селектор на каждый ImageView внутри адаптера, сделайте GridView используемым для выбора селектора:

 GridView gridView = (GridView)view.findViewById(R.id.gridview); gridView.setDrawSelectorOnTop(true); // Make GridView use your custom selector drawable gridView.setSelector(getResources().getDrawable(R.drawable.selector)); 

Теперь нет необходимости:

 picture.setBackgroundResource(R.drawable.selector); 

Редактировать:

Хотя я не рекомендую это (очевидные накладные расходы), он должен работать:

 @Override public View getView(int i, View view, ViewGroup viewGroup) { View v = view; ImageView picture; .... .... LayerDrawable ld = new LayerDrawable(new Drawable[] // Drawable from item { getResources().getDrawable(item.drawableId), // Selector getResources().getDrawable(R.drawable.selector)}); // Set the LayerDrawable picture.setImageDrawable(ld); // Don't need this // picture.setBackgroundResource(R.drawable.selector); return v; } 
  1. Попробуйте установить attribute android:drawSelectorOnTop xml attribute android:drawSelectorOnTop в файле activity_collections.xml

  2. Посмотрите, помещает ли gridView.setDrawSelectorOnTop(true); После gridView.setAdapter(); помогает. Иногда порядок имеет значение (странно)

  3. Если все остальное не удается, вам может потребоваться переключить GridView на другой вид, в котором установлено, что setDrawSelectorOnTop () работает последовательно.

НТН