我已经在扩展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);
}
}
...
}
事实上,当我点击我的自定义按钮时没有任何反应......使用调试器,我可以看到该功能永远不会被调用。我不知道为什么。
那么,我忘记了一步吗?还有其他我错过的东西吗?
答案 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);
...
}