State_pressed фон для нескольких просмотров, onClick - PullRequest
2 голосов
/ 12 мая 2011

Как добиться эффекта android:background изменения для нескольких Views одновременно, щелкнув по любому из них?

Note that contents vary

Я получил макет «значок» из двух частей. Они действуют как одна кнопка, но две части имеют разные StateListDrawable (селекторы), определяющие фоны для state_pressed и т. Д. Первая часть - это заголовок («lefter») с изображением. Второе - это область контента, которая заполняется различными подконтентами. Все сводится к тому, что содержимое обеих частей бывает разных размеров.

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

<LinearLayout
    style="@style/Badge">

    <!-- LEFTER -->
    <LinearLayout
            style="@style/BadgeLefter"
            android:background="@drawable/badge_lefter_bg_blue">
            <ImageView
                    style="@style/BadgeLefterImage"
                    android:src="@drawable/office_building"/>
    </LinearLayout>

    <!-- CONTENT -->
    <LinearLayout
            android:id="@+id/badge_blue_content"
            style="@style/BadgeContent"
            android:background="@drawable/badge_content_bg_blue">
    </LinearLayout> 
</LinearLayout>

Пример StateListDrawable селектора фона (как @drawable/badge_content_bg_blue выше):

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="false" android:state_pressed="false"
    android:drawable="@drawable/badge_bg_blue_normal"/>
<item android:state_focused="false" android:state_pressed="true"
    android:drawable="@drawable/badge_bg_blue_pressed"/>
<item android:state_focused="true"
    android:drawable="@drawable/badge_bg_blue_focused"/>
<item android:state_focused="true" android:state_pressed="true"
    android:drawable="@drawable/badge_bg_blue_pressed"/>
</selector>

, где badge_bg_blue_normal и т. Д. - это png с 9 патчами.

Я новичок в Android. Мне не удалось найти подобный вопрос здесь. Это не помогает настроить мой собственный Button, потому что кнопки имеют только один Android: фон selector. Я не нашел 9-патч, поддерживающий несколько растягиваемых областей. Я понимаю, что мог бы создать пользовательский компонент . Это хорошая идея здесь?

Я широко использую свои значки в приложении. Мы будем благодарны за элегантное решение! :)

* РЕДАКТИРОВАНИЕ РЕШЕНИЯ: *

После создания пользовательского компонента с TouchListener у меня все настроено: ^ _ ^

public class Badge extends LinearLayout {
    //...
    public Badge(Context c, AttributeSet attrs) {
        super(c, attrs);
        //... 
        // inflating layouts and setting selector backgrounds here
        //... 
        setClickable(true);
        setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    lefter.setPressed(true);
                    contents.setPressed(true);
                }
                else if (event.getAction() == MotionEvent.ACTION_UP || !isInside(v, event)) {
                    lefter.setPressed(false);
                    contents.setPressed(false);
                }
                return false;
            }

            private boolean isInside(View v, MotionEvent event) {
                //...
            }
        });
   }
   //...
}

1 Ответ

1 голос
/ 16 мая 2011

Если я правильно понимаю ваш вопрос, у вас есть две кнопки, и после нажатия одной из них обе они должны вести себя так, как они нажимаются?

После нажатия одной из кнопок вы пытались вызвать функцию View.setPressed (bool) на другой и т. Д.? Вот с чего бы я начал, если бы у меня был такой дизайн, как у вас выше. Если это не сработает, другой подход может состоять в том, чтобы просто переключать фон для рисования на всех кнопках при нажатии одной из них и просто не использовать встроенную функциональность state_pressed.

Относительно 9-патчей, которые растягиваются в нескольких областях, вы можете добиться этого с помощью 9-патч-инструмента, включенного в Android SDK. Я сделал это с помощью кнопки, которую сделал сам, которая имела статическую центральную область (по вертикали) и две растягиваемые области сверху и снизу.

...