
EditText
的
enabled如果设置为false就不可用了。
默认都是设置为true,在代码里也可以设置
setEnabled(true);
是这么写的吧~
简单一点理解,在移动应用中,焦点就是当前正在处理事件的位置。在手机应用中,最有可能用到焦点的就是EditText,如果同一个界面中有多个EditText,通常情况下同一时间只有一个能够输入内容,此时,这个EditText就获取了焦点。
在Android中,对焦点的设置分为两种情况,TouchMode和非TouchMode。现在的手机基本都是触摸屏,我们用手指触摸屏幕来 *** 作Android应用时,处于TouchMode。除了TouchMode之外,还有非TouchMode,利用外接设备来 *** 作应用。比如键盘。使用Genymotion模拟器的时候,一个界面上有多个控件时,可以用电脑tab键来进行移动,被选中的控件会高亮显示,这时候就是非TouchMode,被选中的控件获得了焦点。
在手机应用中,用到焦点的时候并不多,但是TV应用中,需要用遥控器来 *** 作选中控件,这时候就需要对焦点进行处理了。关于焦点,常用方法如下:
在View类中, isFocusable() 和 isFocusableInTouchMode() 获取到的结果都是false,也就是说,直接继承自View的控件是不能获取焦点的。我们常用控件中对这两个方法进行了改写,比如EditText,这两个方法都是true,而Button则只有 isFocusable() 返回true。这也就是为什么我们用tab键选取Button的时候能够高亮显示,而鼠标点击(模拟触控)的时候不能高亮显示的原因了。如果想在点击的时候也能高亮显示Button,需要手动设置 setFocusableInTouchMode(true) ,就可以了。
如果想对控件的焦点状态进行监听,需要设置 setOnFocusChangeListener() ,只要控件的焦点状态发生变化(获得或者失去焦点),都会调用 onFocusChange 方法
关于焦点的移动,默认的算法会寻找指定方向上最近的可以获取焦点的元素(非TouchMode)。另外在创建控件的时候,也可以指定寻找焦点的方向,设置nextFocusDown、nextFocusLeft、nextFocusRight 和 nextFocusUp的值为指定元素就可以了。看以下例子:
这里指定了上面的button向上寻找焦点时,下一个元素是id为bottom的元素,也就是说,上面的Button在获取了焦点之后,继续按向上键,系统会将焦点移动到id为bottom的元素上,而不是继续向上。
在开发手机应用的过程中,对焦点的处理并不多,它与事件是两个不同的体系,通常情况下焦点和事件是相互独立并不冲突。但是在Button的点击事件中会有一点问题。如果我们队一个button设置了 setFocusableInTouchMode(true) ,使他可以获取焦点,那么我们点击这个button的时候,第一次点击并不会执行 onClick() 方法,而是执行 onFocusChange() 。第二次点击的时候才会执行 onClick() 方法。看起来好像 onFocusChange() 消耗了点击事件,实际上并不是的。
这个问题我们看一下源码就清楚了:
onClick() 方法是在onTouchEvent的ACTION_UP里调用的,看一下View的onTouchEvent方法:
可以看到,只有当focusTaken为false的时候才会执行onClick,focusTaken的值默认是false的,但是在 isFocusable() && isFocusableInTouchMode() && !isFocused() 为true的时候,会去 requestFocus 获取焦点,并将值赋给focusTaken。
关键在于 isFocused() ,如果当前Button没有获取焦点, isFocused() 返回false, !isFocused() 值为ture,Button就会去获取焦点,从而导致 focusTaken 为true, onClick 方法就不会执行了,只有Button已经获取了焦点的时候才会执行onClick方法。
首先,要对 EditText 进行监听就需要 TextWatch() 这个类来实现。其中在这里最需要的就是该类的 onTextChanged 方法,来得到EditText的实时控制权。这时,我们就能通过判断该方法里的参数 CharSequence 的长度来进行判断。
然后,就是针对“几个”这个关键词,想了一个办法,就是new了一个类,专门用来对几个 EditText 的个数在 onTextChanged 方法中进行累加,只有条件合适了,才对按钮进行相应的 *** 作。而且,每个 EditText 只能加一次,我这里想的办法是加2个boolean类型的数,进行控制,核心代码如下:
1 private boolean check = false, check_ = true;
2
3 @Override
4 public void onTextChanged(CharSequence s, int start, int before, int count) {
5
6 if (slength() > 0) {
7 check = true;
8 } else if(slength() == 0){
9 check_ = true; //开门
10 check = false;
11 }
12 if(check){
13 if(check_){
14 EdtCheckEntitycheckNum++;
15 check_ = false; //关门
16 if(EdtCheckEntitycheckNum == 3){
17 registsetEnabled(true);
18 registsetBackgroundResource(Rdrawableregist_t);
19 }
20 }
21 }else{
22 EdtCheckEntitycheckNum--;
23 if(EdtCheckEntitycheckNum < 3){
24 registsetEnabled(false);
25 registsetBackgroundResource(Rdrawableregist_f);
26 }
27 }
28 }
这个简单,第六个在布局中设置为enable属性,让它不能被 *** 作,然后分别获取六个edittext的控件id,在代码中获取前五个的数据,当点击按钮的时候进行计算,然后把答案显示在第六个上面就行了,这里代码我就不写了,这个很简单
@Override
public boolean dispatchTouchEvent(MotionEvent me) {
if (megetAction() ==MotionEventACTION_DOWN) {//把 *** 作放在用户点击的时候
View v = getCurrentFocus();//得到当前页面的焦点,ps:有输入框的页面焦点一般会被输入框占据
if (isShouldHideKeyboard(v, me)) {//判断用户点击的是否是输入框以外的区域
hideKeyboard(vgetWindowToken());//收起键盘
}
}
return superdispatchTouchEvent(me);
}
/
根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时则不能隐藏
@param v
@param event
@return
/
private boolean isShouldHideKeyboard(View v,MotionEvent event) {
if (v !=null && (vinstanceof EditText)) {//判断得到的焦点控件是否包含EditText
int[]l = {0,0};
vgetLocationInWindow(l);
int left =l[0],//得到输入框在屏幕中上下左右的位置
top =l[1],
bottom =top + vgetHeight(),
right =left + vgetWidth();
if (eventgetX() >left && eventgetX()
&& eventgetY() >top && eventgetY()
// 点击位置如果是EditText的区域,忽略它,不收起键盘。
return false;
}else {
return true;
}
}
// 如果焦点不是EditText则忽略
return false;
}
/
获取InputMethodManager,隐藏软键盘
@param token
/
private void hideKeyboard(IBinder token) {
if (token !=null) {
InputMethodManager im = (InputMethodManager) getSystemService(RealNameVerificationActivitythisINPUT_METHOD_SERVICE);
imhideSoftInputFromWindow(token,InputMethodManagerHIDE_NOT_ALWAYS);
}
}
boolean viewhasFocus()
Returns true if this view has focus iteself, or is the ancestor of the
view that has focus
if(editexthasFocus()) {
//to do
}
Android中有许多写法创建事件处理方式,一般会使用Android:onClick属性来指定。
举例说明:
实现摄氏温度到华氏温度的转变
1、
EditText editText1 =(EditText) findViewById (RideditText1)
c=IntegerparseInt(editText1getText()toString());
用来获取editText1中的信息
2、
EditText editText2 =(EditText) findViewById (RideditText2);
f=(90c)/50+320;
editText2setText(StringvalueOf(f));
通过editText1 获取的信息然后经过计算
将计算的结果返回editText2中然后在editText2中显示出来
扩展资料:
EditText 控件的用法
EditText 在开发中也是经常用到的控件,也是一个比较必要的组件。
它是用户跟Android应用进行数据传输的窗户。
1、android:text设置文本内容。
2、android:textColor字体颜色。
3、android:hint内容为空时候显示的文本。
4、android:textColorHint为空时显示的文本的颜色。
5、android:maxLength限制显示的文本长度,超出部分不显示。
6、android:minLines设置文本的最小行数。
7、android:gravity设置文本位置,如设置成“center”,文本将居中显示。
8、android:drawableLeft在text的左边输出一个drawable,如。
以上就是关于EditText android:enabled="false" 怎样获取点击事件 直接给设置 OnClickListener 没效果全部的内容,包括:EditText android:enabled="false" 怎样获取点击事件 直接给设置 OnClickListener 没效果、Android移动应用中的焦点分析、监听多个EditText,只有当它们都有输入后,相应Button才能被点击等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)