一、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"
>
<!-- 输入框,提供给用户输入信息 -->
<EditText
android:id=
"@+id/inputText"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"请输入信息"
/>
<EditText
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"焦点事件"
/>
<!--文本显示框,用来显示组件焦点变换情况 -->
<TextView
android: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"
>
package
com.heidie.demo;
import
java.security.PublicKey;
import
javax.security.auth.PrivateCredentialPermission;
import
android.app.Activity;
import
android.os.Bundle;
import
android.view.View;
import
android.widget.DatePicker;
import
android.widget.DatePicker.OnDateChangedListener;
import
android.widget.EditText;
import
android.widget.TextView;
import
android.widget.TimePicker;
public
class
TestProActivity
extends
Activity {
private
EditText inputEditText =
null
;
//输入框,用来提供给用户输入信息
private
TextView showTextView =
null
;
//文本显示框,用来显示组件焦点变换情况
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
super
.setContentView(R.layout.main);
/*获得组件*/
inputEditText = (EditText)findViewById(R.id.inputText);
showTextView = (TextView)findViewById(R.id.showText);
//绑定焦点事件
inputEditText.setOnFocusChangeListener(
new
View.OnFocusChangeListener() {
@Override
public
void
onFocusChange(View v,
boolean
hasFocus) {
// TODO Auto-generated method stub
if
(hasFocus){
//如果组件获得焦点
showTextView.setText(
"组件获得了焦点"
);
}
else
{
showTextView.setText(
"组件失去了焦点"
);
}
}
});
//绑定单击事件
inputEditText.setOnClickListener(
new
View.OnClickListener() {
@Override
public
void
onClick(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);
- }
- }