Как избежать селектора при перетаскивании изображения в галерее в Android - PullRequest
2 голосов
/ 05 июля 2011

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

Я определил селектор таким образом:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/pic_frame_pressed" />
    <item android:drawable="@drawable/pic_frame" /> <!-- default -->
</selector>

Это работает. Когда пользователь нажимает на изображение в галерее, отображается рамка ...

Но это также отображается, когда пользователь перетаскивает галерею назад и вперед, используя изображение.

Я посмотрел на различные состояния, которые я мог найти для селектора:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:color="hex_color"
        android:state_pressed=["true" | "false"]
        android:state_focused=["true" | "false"]
        android:state_selected=["true" | "false"]
        android:state_checkable=["true" | "false"]
        android:state_checked=["true" | "false"]
        android:state_enabled=["true" | "false"]
        android:state_window_focused=["true" | "false"] />
</selector>

и я попробовал их, но не смог найти комбинацию, которая срабатывает только тогда, когда пользователь нажимает на изображение (например, «выбранный» всегда срабатывает для изображения, находящегося в центре галереи)

Мне нужно что-то вроде "state_clicked" ...

1 Ответ

4 голосов
/ 13 июля 2011

Я сталкиваюсь с такой же ситуацией здесьЕдинственное решение, которое я нашел, - это обработать переключение фона самостоятельно по событию OnItemClick (что не элегантно: /):

            mGallery.setOnItemClickListener(new OnItemClickListener(){
            @Override
            public void onItemClick(AdapterView<?> parent, View clickedView, int position, long id) {
                for(int i = 0; i < parent.getChildCount(); i++){
                    parent.getChildAt(i).setBackgroundResource(R.drawable.bg_menu);
                    ((TextView) parent.getChildAt(i)).setTextColor(getResources().getColor(R.color.white));
                }
                clickedView.setBackgroundResource(R.drawable.bg_menu_selected);
                ((TextView) clickedView).setTextColor(getResources().getColor(R.color.dark_blue));
                ((SectionAdapter) mGallery.getAdapter()).setSelected(position);
            }
        });

Как видите, я сохраняю выбранную позицию на своем адаптере, чтобы отображать элементы с правильной компоновкой, когда они перерисовываются (теряют фокус)Я действительно хотел найти другое решение, но пока не знаюЕсли кто-нибудь получит его, я буду рад услышать: D

...