Как установить фоновый рисунок кнопки изображения для разных состояний?

Я хочу кнопку с двумя состояниями i) нормальный ii) коснитесь (или нажмите).

Я установил нормальный образ на фоне imagebutton, и я пытаюсь изменить изображение (нажатие) из метода onclick, но это не так. 't изменить.

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

Может ли кто-нибудь предложить мне, как я могу это сделать с помощью селектора или во время выполнения?

Вот мой код изображения.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="horizontal"
  android:gravity="bottom"
  android:id="@+id/buttonpanel">
  <ImageButton android:id="@+id/buttonhome"
               android:layout_width="80dp"
               android:layout_height="36dp"
               android:focusable="true" 
               android:background="@drawable/homeselector">
               </ImageButton>
  <ImageButton android:id="@+id/buttonsearch"
               android:layout_height="36dp"
               android:layout_width="80dp"
               android:background="@drawable/searchselector"
               android:focusable="true">
               </ImageButton>>
  <ImageButton android:id="@+id/buttonreg"
               android:layout_height="36dp"
               android:layout_width="80dp"
               android:background="@drawable/registerselector"
               android:focusable="true">
               </ImageButton>>
  <ImageButton android:id="@+id/buttonlogin"
               android:layout_height="36dp"
               android:layout_width="80dp"
               android:background="@drawable/loginselector"
               android:focusable="true">
               </ImageButton>
</LinearLayout>

а мой селектор 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="@drawable/homehover" 
        /> <item android:state_focused="true" android:drawable="@drawable/homehover" 
        /> <item android:drawable="@drawable/home" /> <item android:state_window_focused="true" 
        android:drawable="@drawable/homehover" /> -->
    <item android:state_enabled="false" android:drawable="@drawable/homehover" />
    <item android:state_pressed="true" android:state_enabled="true"
        android:drawable="@drawable/homehover" />
    <item android:state_focused="true" android:state_enabled="true"
        android:drawable="@drawable/homehover" />
    <item android:state_enabled="true" android:drawable="@drawable/home" />

</selector> 

И я также попытался изменить ресурс изображения в ontouch и onclick-событии, но это не помогает.

Ответ 1

Создайте xml файл в своем чертеже следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_enabled="false"
        android:drawable="@drawable/btn_sendemail_disable" />
    <item
        android:state_pressed="true"
        android:state_enabled="true"
        android:drawable="@drawable/btn_send_email_click" />
    <item
        android:state_focused="true"
        android:state_enabled="true"
        android:drawable="@drawable/btn_sendemail_roll" />
    <item
        android:state_enabled="true"
        android:drawable="@drawable/btn_sendemail" />
</selector>

И установите соответствующие изображения, а затем установите этот xml в качестве фона вашего imageButton.

Ответ 2

Попробуйте это

btn.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        btn.setBackgroundResource(R.drawable.icon);
    }
});

Ответ 3

Привет, попробуйте следующий код, который вам будет полезен,

((ImageView)findViewById(R.id.ImageViewButton)).setOnTouchListener(new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN)
            ((ImageView) v.findViewById(R.id.ImageViewButton)).setImageResource(R.drawable.image_over);

        if(event.getAction() == MotionEvent.ACTION_UP)
            ((ImageView) v.findViewById(R.id.ImageViewButton)).setImageResource(R.drawable.image_normal);

        return false;
    }
});

Ответ 4

MHH. У меня есть другое решение, которое помогло мне, потому что у меня просто два разных состояния:

  • элемент не нажат
  • или щелкнуть по нему, чтобы он был выделен.

В моем .xml я определяю ImageButton следующим образом:

 <ImageButton
    android:id="@+id/imageButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/selector" />

Соответствующий файл выбора выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/ico_100_checked" android:state_selected="true"/>
    <item android:drawable="@drawable/ico_100_unchecked"/>

</selector>

И в моем onCreate я вызываю:

final ImageButton ib = (ImageButton) value.findViewById(R.id.imageButton);

    OnClickListener ocl =new OnClickListener() {
        @Override
        public void onClick(View button) {
            if (button.isSelected()){
                button.setSelected(false);
            } else {
                ib.setSelected(false);
                //put all the other buttons you might want to disable here...
                button.setSelected(true);
            }
        }
    };

ib.setOnClickListener(ocl);
//add ocl to all the other buttons

сделано. надеюсь это поможет. Мне потребовалось некоторое время, чтобы понять.

Ответ 5

Я думаю, что проблема не в селекторном файле.

вам нужно добавить

<imagebutton ..
    android:clickable="true"
/>

к вашим кнопкам изображения.

по умолчанию onClick обрабатывается на уровне списка (родительский). и imageButtons не получают onClick.

когда вы добавляете вышеуказанный атрибут, кнопка изображения получит событие, и будет использоваться селектор.

проверьте этот POST, который объясняет это для флажка.

Ответ 6

если вы хотите нажать кнопку изображения, то изображение должно быть изменено с обычного на нажатое

Но лучший способ - настроить RadioButton и использовать их в группе. Я вижу пример этого. Извините, я не помню эту ссылку.

но если вы хотите этого избежать. Вы должны добавить это в свой selector.xml

После выполнения. Просто добрался до вашего кода и добавьте его

public void onClick ( View v ) {
    myImageButton.setSelected ( true ) ;
 }

Вы увидите результат. Но вам нужно управлять состояниями, которые недавно нажала кнопка. Чтобы вы могли установить

  myOLDImageButton.setSelected ( false ) ;

Я предлагаю вам поставить ссылку на все кнопки в массиве.

Ответ 7

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

здесь http://blog.bookworm.at/2010/10/segmented-controls-in-android.html - пример того, как это сделать. Основная идея заключается в настройке RadioButton вместо ImageButton, так как RadioButton будет иметь проверенное состояние, которое вам нужно

Ответ 8

Вы пробовали CompoundButton? CompoundButton имеет проверяемое свойство, которое точно соответствует вашим потребностям. Замените ImageButtons на них.

  <CompoundButton android:id="@+id/buttonhome"
                  android:layout_width="80dp"
                  android:layout_height="36dp"
                  android:background="@drawable/homeselector"/>

Измените селектор xml на следующее. Может потребоваться некоторое изменение, но обязательно используйте state_checked вместо state_pressed.

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:drawable="@drawable/homehover" />
    <item android:state_checked="true" android:state_enabled="true"
          android:drawable="@drawable/homehover" />
    <item android:state_focused="true" android:state_enabled="true"
          android:drawable="@drawable/homehover" />
    <item android:state_enabled="true" android:drawable="@drawable/home" />

</selector> 

В CompoundButton.OnCheckedChangeListener вам нужно проверить и снять отметку с другого на основе ваших условий.

 mButton1.setOnCheckedChangeListener(new OnCheckedChangeListener() {

   public void onCheckedChanged (CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            // Uncheck others. 
        }
   }
});

Аналогично устанавливайте a OnCheckedChangeListener для каждой кнопки, которая отключает другие кнопки, когда она проверяется. Надеюсь, что это поможет.

Ответ 9

Ответ на @ingsaurabh - это путь, если вы используете onClick. Однако, если вы используете событие onTouch, вы можете выбрать разные фоны (по-прежнему такие же, как в примере @ingsaurabh), используя view.setPressed().

Для получения дополнительной информации см. следующее: "Нажмите и удерживайте" на Android необходимо изменить состояния (настраиваемый селектор XML) с помощью onTouchListener

Ответ 10

вы можете создать файл селектора в res/drawable

Пример: Рез/рисуем/selector_button.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/btn_disabled" android:state_enabled="false" />
    <item android:drawable="@drawable/btn_enabled" />
</selector>

и в макете, фрагменте или т.д.

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/selector_bg_rectangle_black"/>