Состояние обработки пользовательских кнопок - PullRequest
0 голосов
/ 30 марта 2012

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

Вот некоторый код (только один TextView и ImageView для примера):

В main.xml родительский макет представляет собой LinearLayout, вот пользовательская кнопка:

<RelativeLayout
    android:id="@+id/relativelayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="10dip"
    android:layout_marginRight="10dip"
    android:layout_marginTop="25dp"
    android:background="@drawable/background_state"
    android:clickable="true"
    android:focusable="true" >

    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="8dip"
        android:clickable="true"
        android:text="Awesome text"
        android:textColor="@color/textview_state"
        android:textSize="20sp" />

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="51dip"
        android:layout_height="51dip"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="5dip"
        android:clickable="true"
        android:src="@drawable/imageview_state" />

    <View
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:layout_alignParentTop="true"
        android:background="#FFFFFF"
        android:clickable="false"
        android:focusable="false" />

    <View
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:layout_alignParentTop="true"
        android:layout_marginTop="50dip"
        android:background="#D3E992"
        android:clickable="false"
        android:focusable="false" />

</RelativeLayout>

В папке drawable, imageview_state.xml:

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

В папке drawable-hdpi находятся imageview.png и imageview_pressed.png.

В папке цвета, background_state.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="#E0EBCC"/>
    <item android:drawable="#669900"/>

</selector>

В папке с цветом textview_state.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:color="#000"/>
    <item android:color="#FFF"/>
</selector>

Пока, когда я нажимаю на RelativeLayout, фон RelativeLayout изменяется правильно, ноImageView и TextView остаются в состоянии по умолчанию.Я попытался установить свойство android: clickable = "true" для TextView и ImageView, но только состояние нажатого элемента изменяет его, а не вся кнопка.

Любая помощь для достижения моей цели приветствуется:)

Ответы [ 2 ]

0 голосов
/ 31 марта 2012

Как предложил Booger, я использовал OnTouchListener, и я в основном делаю изменения внутри.Это работает отлично, я бы предпочел решение XML, но что угодно.Внутри моей деятельности:

RelativeLayout relativeLayout= (RelativeLayout) findViewById(R.id.relativelayout);
relativeLayout.setOnTouchListener(...);

Реализация слушателя:

    public boolean onTouch(View v, MotionEvent event)
    {
        TextView text = (TextView) findViewById(R.id.textview);
        ImageView image = (ImageView) findViewById(R.id.imageview);
        RelativeLayout layout = (RelativeLayout) findViewById(R.id.relativelayout);
        if (event.getAction() == android.view.MotionEvent.ACTION_DOWN)
        {
            layout.setBackgroundResource(R.color.background_pressed);
            text.setPressed(true);
            image.setPressed(true);

        } else if (event.getAction() == android.view.MotionEvent.ACTION_UP)
        {
            layout.setBackgroundResource(R._background);
            text.setPressed(false);
            image.setPressed(false);
        }
        return false;
    }

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

 android:background="@color/background"

Больше не ссылается на селектор.

0 голосов
/ 30 марта 2012

Вы можете установить OnClickListener на свой относительный макет, а затем просто сделать что-то в своем коде, когда он будет нажат. Как этот псевдокод.

RelativeLayout rl = (RelativeLayout) findViewById(R.id.myRelLayout);
rl.setOnClickListener(.....) {
    button1.setBackgroudDrawable(R.drawable.newColor).
    text1.setText("Something");
}
...