一、EditText监听焦点例子,setOnFocusChangeListener
-
范例:如图所示显示输入框组件焦点获得及失去情况,并用TextView显示出来的效果
- mail.xml代码如下:
-
[Java] 纯文本查看 复制代码010203040506070809101112131415161718192021222324
<font color="#000000"><?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical"><!-- 输入框,提供给用户输入信息 --><EditTextandroid:id="@+id/inputText"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="请输入信息"/><EditTextandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="焦点事件"/><!--文本显示框,用来显示组件焦点变换情况 --><TextViewandroid:id="@+id/showText"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="请输入信息"/></LinearLayout></font>
-
Activity——TestProActivity.java代码如下:
-
[Java] 纯文本查看 复制代码
v0102030405060708091011121314151617181920212223242526272829303132333435363738394041424344454647484950515253<font color="#000000">packagecom.heidie.demo;importjava.security.PublicKey;importjavax.security.auth.PrivateCredentialPermission;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.DatePicker;importandroid.widget.DatePicker.OnDateChangedListener;importandroid.widget.EditText;importandroid.widget.TextView;importandroid.widget.TimePicker;publicclassTestProActivityextendsActivity {privateEditText inputEditText =null;//输入框,用来提供给用户输入信息privateTextView showTextView =null;//文本显示框,用来显示组件焦点变换情况publicvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.main);/*获得组件*/inputEditText = (EditText)findViewById(R.id.inputText);showTextView = (TextView)findViewById(R.id.showText);//绑定焦点事件inputEditText.setOnFocusChangeListener(newView.OnFocusChangeListener() {@OverridepublicvoidonFocusChange(View v,booleanhasFocus) {// TODO Auto-generated method stubif(hasFocus){//如果组件获得焦点showTextView.setText("组件获得了焦点");}else{showTextView.setText("组件失去了焦点");}}});//绑定单击事件inputEditText.setOnClickListener(newView.OnClickListener() {@OverridepublicvoidonClick(View v) {inputEditText.setText(" ");//清空输入框内容}});}}</font>
(二)View的requestFocus()和requestFocusFromTouch()方法的区别
userNameEditText.requestFocusFromTouch();
}else{
userNameEditText.requestFocus();
}
不理解这两个方法的意思,去看了下API。了解了:
首先,这两个方法都是获得焦点的方法。
其次,requestFocus()在两种情况下不能获得焦点:
1.对应的View不支持Focus
2.对应的View支持Focus,但是不支持在Touch模式下的Focus。
而requestFocusFromTouch()就是解决requestFocus()的第二种不能获得焦点的情况,也就是说即使在Touch模式下不支持焦点,也能够获得焦点。
(三)setOnFocusChangeListener木有反应,因为Touch Mode下原本不存在focus,要增加一句代码:button.setFocusableInTouchMode(true)
今天试跑了"Google Android SDK开发范例大全源码里的EX04_02工程",发现mImageButton1.setOnFocusChangeListener这个监听器木有反应。查了很多资料发现原因是:在Android TouchMode模式下是不存在focus的。所谓的focus是指被选中的意思,类似于windows平台下单击一个文件夹后鼠标的焦点(focus)就在该文件夹上面。既然不存在focus,也就不存在FocusChange的问题,所以setOnFocusChangeListener监听器不起作用也就可以理解。如果想在TouchMode下面使用这个监听器可以使用如下两种方法:
1.增加一句代码:mImageButton1.setFocusableInTouchMode(true)
2.在main.xml中mImageButton标签中加入一个子标签:android:focusableInTouchMode="true"。这两种方法的作用都是使得focus在TouchMode下恢复作用。
关于TouchMode可以参考下面两片文章:
1.http://developer.android.com/resources/articles/touch-mode.html
2.http://hi.baidu.com/qmiao128/blog/item/3bc40f54e0605144574e0048.html
下面附上Google Android SDK开发范例大全源码里的EX04_02工程源代码
- public class EX04_02 extends Activity
- {
- /*声明三个对象变量(图片按钮,按钮,与TextView)*/
- private ImageButton mImageButton1;
- private Button mButton1;
- private TextView mTextView1;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- /*通过findViewById构造三个对象*/
- mImageButton1 =(ImageButton) findViewById(R.id.myImageButton1);
- mButton1=(Button)findViewById(R.id.myButton1);
- mTextView1 = (TextView) findViewById(R.id.myTextView1);
- /*通过OnFocusChangeListener来响应ImageButton的onFous事件*/
- mImageButton1.setOnFocusChangeListener(new OnFocusChangeListener()
- {
- public void onFocusChange(View arg0, boolean isFocused)
- {
- // TODO Auto-generated method stub
- /*若ImageButton状态为onFocus改变ImageButton的图片
- * 并改变textView的文字*/
- if (isFocused==true)
- {
- mTextView1.setText("图片按钮状态为:Got Focus");
- mImageButton1.setImageResource(R.drawable.iconfull);
- }
- /*若ImageButton状态为offFocus改变ImageButton的图片
- *并改变textView的文字*/
- else
- {
- mTextView1.setText("图片按钮状态为:Lost Focus");
- mImageButton1.setImageResource(R.drawable.iconempty);
- }
- }
- });
- /*通过onClickListener来响应ImageButton的onClick事件*/
- mImageButton1.setOnClickListener(new OnClickListener()
- {
- public void onClick(View v)
- {
- // TODO Auto-generated method stub
- /*若ImageButton状态为onClick改变ImageButton的图片
- * 并改变textView的文字*/
- mTextView1.setText("图片按钮状态为:Got Click");
- mImageButton1.setImageResource(R.drawable.iconfull);
- }
- });
- /*通过onClickListener来响应Button的onClick事件*/
- mButton1.setOnClickListener(new OnClickListener()
- {
- public void onClick(View v)
- {
- // TODO Auto-generated method stub
- /*若Button状态为onClick改变ImageButton的图片
- * 并改变textView的文字*/
- mTextView1.setText("图片按钮状态为:Lost Focus");
- mImageButton1.setImageResource(R.drawable.iconempty);
- }
- });
- }
- }
Framework控制焦点移动到另一个组件的算法是在某一方向上邻近的组件,在极个别情况下,默认的算法可能不符合开发者的预想要求,在这种情况下,你可以覆写下列XML属性的布局文件:nextFocusDown ,nextFocusLeft ,nextFocusRight ,和nextFocusUp 设置他们的值来明确
焦点从当前界面移动下个界面的Id。例如:
<LinearLayout
android:orientation="vertical"
... >
<Button android:id="@+id/top"
android:nextFocusUp="@+id/bottom"
... />
<Button android:id="@+id/bottom"
android:nextFocusDown="@+id/top"
... />
</LinearLayout>
一般来说,在这个垂直布局,浏览的焦点会从第一个按钮开始,不会是从第二个或者其他的,现在topButtont已经通过nextFocusUp (反之亦然)确定了bottom.
通常如果你想宣布用户界面具有焦点的资格 (如果这个界面在传统上是没有的),可以在xml布局里去加上的android:focusable的属性,并设置它的值,您也可以宣布在触摸模式下具有焦点的资格,同样也只在xml里添android:focusableInTouchMode.的属性,并设置它的值. 当用户请求在某个界面聚集焦点时,会调用requestFocus().这个方法。监听到焦点活动(获得焦点或失去焦点都会被通知),会调用onFocusChange(),这个方法。虽然帖子比较短,但是我感觉这个例子还是非常有用的,希望对开发者有一些帮助。想继续交流的可以回帖。
- //监听焦点事件
- et_search.setOnFocusChangeListener(new OnFocusChangeListener() {
- @Override
- public void onFocusChange(View v, boolean isFocused) {
- // TODO Auto-generated method stub
- System.out.println(isFocused);
- if(!isFocused){
- et_search.setVisibility(View.GONE);
- }
- }
本文详细介绍了如何在Android中监听EditText组件的焦点事件,包括焦点获得与失去的处理方式,以及如何在TouchMode模式下使焦点事件生效。通过实例代码展示了如何使用OnFocusChangeListener接口实现焦点改变的回调,并提供了相关方法的区别解释与使用技巧。
1081

被折叠的 条评论
为什么被折叠?



