2 qq 33058175 qq_33058175 于 2016.03.04 14:34 提问

Android自定义Button的OnKeyDown方法没反应

代码如下:
自定义Button类
public class MyButton extends Button{
public MyButton(Context context,AttributeSet set) {
super(context,set);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    super.onKeyDown(keyCode,event);
    TextView tv = (TextView) findViewById(R.id.aa);
    tv.setText("123232323");
    Log.v("111","2222");
    return super.onKeyDown(keyCode, event);
}

}

界面xml代码:
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:orientation="vertical"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

<TextView
    android:id="@+id/aa"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
<com.example.cg.view.MyButton
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

5个回答

VqwertyV
VqwertyV   2016.03.04 14:43

onKeyDown方法监听的是按下系统的Home键,后退键等的监听,
你这是要实现点击按钮改变另外一个TextView的文字吧,直接写个Button再setOnClickListener不行吗?
或者说非要自定义一个Button的话在构造方法中调用setOnClickListener(this),然后在你的MyButton类中实现OnClick方法也可以,不过没什么必要

VqwertyV
VqwertyV 回复qq_33058175: 刚查了下,View的onKeyDown和Activity的onKeyDown不是同一个方法,不过确实都是监听系统的按键的,还监听软键盘,比如一个EditText上按Enter就跳转到下一个EditText或者实现其他功能,之类的,我也是菜鸟,
接近 2 年之前 回复
qq_33058175
qq_33058175 那就是说onKeyDown只能监听系统键?不过每个控件都可以重写onKeyDown方法呀!控件中的这个方法应该怎么用呢
接近 2 年之前 回复
qq_33058175
qq_33058175 嗯,您说的也没错,因为我现在正在学这个,看到“基于回调的事件处理”这块,这里是用Button自身方法去实现的,并没有用到事件监听器
接近 2 年之前 回复
menghuanmusic
menghuanmusic   2016.03.04 14:45

public class ****Acticity extends Activity {
@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

MyButton mybutton = new MyButton(this);

mybutton.setFocusable(true);

setContentView(mybutton);

}
}


点击没效果,是因为Activity也有onKeyDown,你在view中设置了onKeyDown,点击时,系统不知道要响应哪一个。你给button添加一个焦点。

VqwertyV
VqwertyV 回复qq_33058175: AttributeSet是xml文件中解析出来的属性,在xml文件中写了一个View的时候系统在inflate的时候自动调用生成的,自己写的话一般只用一个参数的,或者你也可以自定义属性
接近 2 年之前 回复
wanghang1208
wanghang1208 回复qq_33058175: 重载一个构造方法:public MyButton(Context context) { super(context,set); }
接近 2 年之前 回复
luochoudan
luochoudan 回复qq_33058175: 这个参数表示从资源文件(一般是attrs.xml)中加载一些属性信息。
接近 2 年之前 回复
qq_33058175
qq_33058175 学习了,不过我自定义控件的构造方法是两个参数的,第二个AttributeSet类型的参数应该写什么呀!
接近 2 年之前 回复
huamanlou02
huamanlou02   2016.03.04 15:28
luochoudan
luochoudan   Ds   Rxr 2016.03.04 17:15

Activity中提供了这个方法,可以让你重写。这个基于回调的事件,只有当按下键盘键,并且别的地方没有处理,才会传递给activity。一般的button是不会响应这个事件的,明白了吧。

huaheshangxo
huaheshangxo   2016.03.04 21:42

我猜你想写的是onTouchEvent

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!