Android onFocusChanged函数从未调用过

时间:2011-07-30 21:32:35

标签: java android

我已经在扩展View类中创建了一个自定义按钮,如本教程中所指定的那样:

  

http://kahdev.wordpress.com/2008/09/13/making-a-custom-android-button-using-a-custom-view/

但我对函数onFocusChanged()的问题从未被调用过。

这是我的代码:

public class CustomButton extends View
{
    ...
    public CustomButton(Context context, Car car) 
    {
        super(context);
        setFocusable(true);
        setBackgroundColor(Color.BLACK);
        setOnClickListener(listenerAdapter);
        setClickable(true);
    }

    @Override
    protected void onFocusChanged(boolean gainFocus, int direction,
                                  Rect previouslyFocusedRect)
    {
        if (gainFocus == true)
        {
            this.setBackgroundColor(Color.rgb(255, 165, 0));
        }
        else
        {
            this.setBackgroundColor(Color.BLACK);
        }
    }
    ...
}

事实上,当我点击我的自定义按钮时没有任何反应......使用调试器,我可以看到该功能永远不会被调用。我不知道为什么。

那么,我忘记了一步吗?还有其他我错过的东西吗?

3 个答案:

答案 0 :(得分:7)

事实上,问题是我没有将我的自定义按钮的属性“在触摸模式下可聚焦”设置为true。我在构造函数setFocusableInTouchMode(true);中添加了它,效果更好。感谢Phil和Vicki D的帮助。

public class CustomButton extends View
{
    ...
    public CustomButton(Context context, Car car) 
    {
        super(context);
        setFocusable(true);
        setFocusableInTouchMode(true); // Needed to call onFocusChanged()
        setBackgroundColor(Color.BLACK);
        setOnClickListener(listenerAdapter);
        setClickable(true);
    }

    @Override
    protected void onFocusChanged(boolean gainFocus, int direction,
                                  Rect previouslyFocusedRect)
    {
        if (gainFocus == true)
        {
            this.setBackgroundColor(Color.rgb(255, 165, 0));
        }
        else
        {
            this.setBackgroundColor(Color.BLACK);
        }
        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);  
    }
    ...
}

答案 1 :(得分:0)

文档说“当覆盖时,请务必调用超类,以便进行标准焦点处理。”您已在上面的代码中省略了该调用,类似下面的内容应该会有所帮助。

@Override
protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect)
{

    if (gainFocus == true)
    {
        this.setBackgroundColor(Color.rgb(255, 165, 0));
    }
    else
    {
        this.setBackgroundColor(Color.BLACK);
    }
    super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);  
}

答案 2 :(得分:0)

您必须在构造函数中setOnFocusChangeListener。像这样的东西:

 public CustomButton(Context context, Car car) 
{
    ...
    setOnFocusChangeListener(this);
    ...
}