Як встановити фонове зображення кнопки зображення для іншого стану?


81

Мені потрібна кнопка зображення з двома станами i) нормальна ii) дотик (або клацання).

Я встановив нормальне зображення на фоні кнопки зображення, і я намагаюся змінити зображення (натиснуте) із методу 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 event, але це не допомагає.


Я думаю , що ви шукаєте що - щось на зразок цього . Подібне запитання я задавав ще тому.
Federico klez Culloca

Відповіді:


225

Створіть 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.


11
Правильно. це буде називатися Selector XML
Аман Алам

4
@Hitendra: Я думаю, оператор це вже знав. запитання можна інтерпретувати як те, чому селектор не викликається.
Самуель

Чи потрібно state_enabled?
Dr.jacky

4
Це працює для звичайних Button, але ні ImageButton. Також це буде працювати для атрибута ImageButton'' android:src, але ні android:background. І яка різниця між вашим та селектором OP (крім форматування та імен малюнків)? Мені чогось не вистачає?
Олександр Малахов

@AlexanderMalakhov Для мене це дуже добре працює для ImageButton та android: background.
Триларіон

15

Спробуйте це

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

чи є хтось із ідеєю, що я можу це зробити
Хітендра

9

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

Привіт, спробуйте наступний код, який буде вам корисний,

((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;
    }
});

1
насправді це також насправді не працює, якщо action_up відбувається в іншому поданні. спробуйте використовувати event.getAction () == MotionEvent.ACTION_CANCEL замість ACTION_UP.
chug2k

3

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

ви повинні додати

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

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

за замовчуванням onClick обробляється на рівні елемента списку (батьківський). а кнопки imageBon не отримують onClick.

при додаванні вищевказаного атрибута кнопка зображення отримає подію і буде використаний селектор.

позначте цей POST, який пояснює те саме для прапорця.


1

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

Але найкращим способом буде налаштувати RadioButton і використовувати їх у групі. Я бачу приклад цього. Вибачте, я не згадав це посилання.

але якщо ви хочете цього уникнути. Вам потрібно додати це до вашого selector.xml

Після закінчення. Щойно дійшов до свого коду і додав це

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

Ви побачите результат. Але ви повинні керувати штатами, яку кнопку нещодавно натискали. Так що ви можете встановити

  myOLDImageButton.setSelected ( false ) ;

Я пропоную вам помістити всі посилання на кнопки у масив.


0

те, що ви намагаєтеся зробити, - це більше сегментована кнопка, ніж список кнопок зображення.

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


ні .. Думаю, думаю, саме цього він і хотів. сегментований контроль - це зовсім інший елемент інтерфейсу. він хоче 1 кнопку, яка змінює стан.
Henley Chiu,

0

Ви пробували 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. 
        }
   }
});

Подібним чином встановіть OnCheckedChangeListenerдля кожної кнопки а, яка знімає прапорець з інших кнопок, коли вона встановлена. Сподіваюся, це допомагає.


Ви не можете використовувати CompoundButton безпосередньо в XML, оскільки це абстрактний клас.
Dan Hulme,

0

Відповідь @ ingsaurabh - це шлях, якщо ви використовуєте onClick even. Однак, якщо ви використовуєте подію onTouch, ви можете вибрати різні фони (все ті ж, що в прикладі @ ingsaurabh), використовуючиview.setPressed() .

Докладніше див. Нижче: Кнопка "Натисніть і утримуйте" на Android повинна змінити стан (власний селектор XML) за допомогою onTouchListener


0

Ви можете створити файл селектора в res / drawable

приклад: 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"/>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.