2011-01-21 2 views
77

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

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

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

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

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

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

+0

Я думаю, что вы смотрите для чего-то вроде [этого] (http://stackoverflow.com/questions/3097710/android-change-button-background-programmatically/3097844#3097844). Я задал аналогичный вопрос назад. –

ответ

214

Создайте файл XML в вашем Drawable так:

<?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 XMLs –

+4

@Hitendra: я думаю, оп понял уже. вопрос может быть истолкован как причина, по которой селектор не вызывается. – Samuel

+1

Он работал супер для меня, спасибо, много – Naruto

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; 
    } 
}); 
+4

-1 Вопрос четко указывает на использование селекторов, а не код Java – Merlin

+1

. На самом деле это тоже не работает, если action_up происходит на другом представлении. попробуйте использовать event.getAction() == MotionEvent.ACTION_CANCEL вместо ACTION_UP. – chug2k

14

Попробуйте

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

Я пробовал все, кроме не выше, помогите мне. – Hitendra

+0

есть ли кто-нибудь с идеей, что я могу это сделать – Hitendra

0

, что вы пытаетесь сделать, это больше, чем segmentedbutton списка IMAGEBUTTON.

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

+0

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

3

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

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

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

для кнопок изображения.

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

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

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

1

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

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

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

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

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

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

myOLDImageButton.setSelected (false) ; 

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

+0

извините за это совсем не помогло ... –

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 к каждой кнопке, которая снимите другие кнопки, когда проверяется. Надеюсь это поможет.

+0

Вы не можете использовать CompoundButton непосредственно в XML, так как это абстрактный класс. –

8

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 

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

0

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

Смотрите следующее для более подробной информации: "Press and hold" button on Android needs to change states (custom XML selector) using onTouchListener

0

вы можете создать файл селектора в разрешении/вытяжке

пример: Рез/вытяжке/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"/> 
Смежные вопросы