2011-01-21 103 views
77

我想要兩個狀態的圖像按鈕i)正常ii)觸摸(或點擊)。如何設置圖像按鈕backgroundimage爲不同的狀態?

我已在的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事件圖像資源,但它並不能幫助。

+0

我認爲你看ing [像這樣](http://stackoverflow.com/questions/3097710/android-change-button-background-programmatically/3097844#3097844)。我之前曾問過類似的問題。 – 2011-01-21 06:05:15

回答

214

這樣創建您繪製的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

正確。這將被稱爲選擇器XML – 2011-01-21 06:32:50

+4

@Hitendra:我想操作已經知道這一點。該問題可以解釋爲選擇器沒有被調用的原因。 – Samuel 2011-08-23 03:10:52

+1

它爲我工作超級,謝謝lot – Naruto 2012-07-19 19:20:20

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

試試這個

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

我認爲你的問題不是選擇器文件。

你必須

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

添加到您的圖像按鈕。

默認情況下,onClick在列表級別(父級)處理。和imageButtons不會收到onClick。

當您添加上述屬性時,圖像按鈕將接收事件並且將使用選擇器。

檢查此POST這說明覆選框相同。

1

如果你想擠壓的圖像按鈕,然後形象應該是從正常到改變按下

但我最好的方法將是自定義單選按鈕和一個組中使用它們。我看到了一個例子。 對不起,我不記得那個鏈接。

但如果你想避免這一點。 您需要將其添加到您的selector.xml中

一旦完成。剛到你的代碼並添加這個

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

你會看到結果。但是你必須管理最近按下按鈕的狀態。所以你可以設置

myOLDImageButton.setSelected (false) ; 

我建議你把所有的按鈕引用放在一個數組中。

0

你試過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每個按鈕,當檢查這將取消其它按鈕。希望這可以幫助。

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

你可以創建資源選擇文件/繪製

例如: RES /繪製/ 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"/>