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;
}

  1. попробуйте установить xml attribute android:drawSelectorOnTop в своем

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

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

HTH