Как установить фоновое изображение кнопки изображения для другого состояния? - PullRequest
80 голосов
/ 21 января 2011

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

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

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

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

Вот мой код imagebuttonpanel.

<?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,но это не помогает.

Ответы [ 10 ]

221 голосов
/ 21 января 2011

Создайте 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.

15 голосов
/ 21 января 2011

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

btn.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        btn.setBackgroundResource(R.drawable.icon);
    }
});
8 голосов
/ 05 февраля 2013

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

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

8 голосов
/ 21 января 2011

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

((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;
    }
});
3 голосов
/ 23 августа 2011

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

Вы должны добавить

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

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

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

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

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

1 голос
/ 23 августа 2011

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

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

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

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

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

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

  myOLDImageButton.setSelected ( false ) ;

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

0 голосов
/ 24 октября 2017

вы можете создать селекторный файл в 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"/>
0 голосов
/ 01 января 2015

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

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

0 голосов
/ 24 августа 2011

Вы пробовали CompoundButton? CompoundButton имеет свойство checkable, которое точно соответствует вашим потребностям. Замените 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. 
        }
   }
});

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

0 голосов
/ 19 августа 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...