1

我有簡單的自定義按鈕:自定義視圖(按鈕)背景選擇不工作

public class myButton extends Button { 
    public myButton (Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     commonConstructorCode(); 
    } 


    public myButton (Context context, AttributeSet attrs) { 
     super(context, attrs); 
     commonConstructorCode(); 
    } 

    public myButton (Context context) { 
    super(context); 
    commonConstructorCode(); 
    } 

     private void commonConstructorCode() { 
       this.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
       int action = event.getAction(); 

        if(action == MotionEvent.ACTION_DOWN) 
        { 
         //Just to be sure that we removed all callbacks, 
         // which should have occurred in the ACTION_UP 
         removeCallbacks(repeatClickWhileButtonHeldRunnable); 

         //Perform the default click action. 
         performClick(); 
         //if(v.isEnabled()){ 
         //Schedule the start of repetitions after a one half second delay. 
         postDelayed(repeatClickWhileButtonHeldRunnable, initialRepeatDelay); 
         //} else { 
         // removeCallbacks(repeatClickWhileButtonHeldRunnable); 
         //} 
        } 
        else if(action == MotionEvent.ACTION_UP) { 
         //Cancel any repetition in progress. 
         removeCallbacks(repeatClickWhileButtonHeldRunnable); 
        } 
       //Returning true here prevents performClick() from getting called 
       // in the usual manner, which would be redundant, given that we are 
       // already calling it above. 
       return true; 
     } 
    }); 
     } 
} 

與選擇

<?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/button_pressed" /> <!-- pressed --> 
    <item android:state_focused="true" 
      android:drawable="@android:color/white" /> <!-- focused --> 
    <item android:drawable="@drawable/button_standard" /> <!-- default --> 
</selector> 

通過

<com.blabla.myButton 
    ... 
    background="@drawable/button_selector" /> 

背景在 「正常」 設置狀態很好。但其他國家根本不工作。什麼是奇怪的 - 當我改變

<com.blabla.myButton 

<Button 

選擇工作完全正常。

任何想法?

編輯: 我加了commonConstructorCode()。

+0

好吧,這很奇怪。我試着用選擇器XML文件做一個自定義按鈕,一切都很好。 – user2340612 2013-05-07 23:22:02

+0

我已經在Android 4.2和2.3.7的設備上測試過它 - 兩者的結果都是一樣的,錯誤的。 – androfan 2013-05-07 23:30:00

+0

我使用樣式添加選擇器背景。但直接設置不起作用。 – androfan 2013-05-07 23:37:41

回答

1

我複製你的代碼,並獲得自定義按鈕選擇工作,但設置:

 @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      // Blah blah blah.... 
      return false; // this was return true 
     } 
    }); 

根據android的文檔,公共布爾onTouch(),

返回:如果收聽者消耗了事件,否則就是錯誤的。

因此返回true表示您的方法已經消耗了該事件並似乎停止它遞送層次結構並觸發選擇器狀態。

+0

太棒了!我還刪除了performClick()以防止由於返回false而導致雙擊。謝謝 ;-)。 – androfan 2013-05-08 20:52:38

+0

樂意幫忙。這讓我煩惱,所以我不得不坐下來嘗試一下; – speedynomads 2013-05-08 21:05:13

1

你可以嘗試在自定義xml視圖上設置它。

android:focusable = "true" 

我也有類似的問題,並允許讀取正確的狀態和應用選擇的視圖設置可聚焦爲true。

+0

不幸的是沒有幫助。 – androfan 2013-05-08 17:23:18

+0

奇怪的是,正常的按鈕標籤的作品和自定義的一個不。非常奇怪。 – speedynomads 2013-05-08 17:31:26

+0

只是一個想法,你可以嘗試添加super.onTouchEvent(event);到您的onTouch的頂部。也許有些東西沒有被你正在擴展的Button類所接收,它需要做選擇器狀態改變。 – speedynomads 2013-05-08 17:33:20

0

在你的類的構造函數,使用下面的代碼:

this.setBackgroundResource(drawable.button_selector); 

我試試吧。完美的作品