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>
Спасибо за любую помощь,
2 ответов
думаю, вы ошибаетесь насчет setDrawSelectorOnTop(boolean)
. The selector
drawable, на который ссылаются здесь, является внутренним GridView selector
drawable.
даже в самой простой реализации GridView
, когда элемент сетки нажат, вокруг него рисуется синяя граница. Это связано с тем, что по умолчанию собственный селектор gridview рисуется behind
элемента. Если вы позвоните setDrawSelectorOnTop(true)
селектор (синий) будет отображаться поверх элемента.
но setDrawSelectorOnTop(boolean)
не имеет ничего общего с селектором вы устанавливаете адаптер. Проходите ли вы true
или false
, поведение селектора ImageView не изменится.
устранение:
вместо установки селектора на каждом ImageView внутри адаптера, сделайте GridView использовать селектор drawable:
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);
Edit:
хотя я не рекомендую это (очевидные накладные расходы), она должна работа:
@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;
}
попробуйте установить xml
attribute android:drawSelectorOnTop
в своемсмотрите, если размещение
gridView.setDrawSelectorOnTop(true);
послеgridView.setAdapter();
помогает. Иногда порядок имеет значение (странно)если все остальное не удается, вам может потребоваться переключить GridView на другое представление, где setDrawSelectorOnTop () работает последовательно.
HTH