Android 动态设置控件获取焦点

之前写过一篇博客,简单的介绍了Android
隐藏EditText的焦点
,之所以要隐藏EditText的焦点,是因为当应用在第一次进入某个Activity时,由于该页面中的EditText获取了焦点,致使键盘弹出,而影响了用户的体验。

今天扩展下之前的内容,简单介绍如何动态设置某个控件获取到焦点。

首先,定义页面布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/edit_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:orientation="vertical" >

        <EditText
            android:id="@+id/edit_name"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="姓名"
            android:inputType="text"
            android:minHeight="50dp" />

        <EditText
            android:id="@+id/edit_mobile"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="手机号"
            android:inputType="phone"
            android:minHeight="50dp" />
    </LinearLayout>

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:text="确定"
        android:onClick="setFocus"
        />

</LinearLayout>

   观察下,我已经对两个EditText的父容器LinearLayout设置了两行代码android:focusable="true",android:focusableInTouchMode="true"。有了这两行代码,当我们进入该Activity时,便不会弹出软键盘啦。

下面,我们对两个文本输入框定义焦点事件:

private class OnFocusHandler implements OnFocusChangeListener {
		@Override
		public void onFocusChange(View v, boolean hasFocus) {
			switch (v.getId()) {
			case R.id.edit_name:

				if (hasFocus) {
					edit_name.setText("ning shuai");
				} else {
					edit_name.setText("");
				}
				break;
			case R.id.edit_mobile:
				if (hasFocus) {
					edit_mobile.setText("963258741");
				} else {
					edit_mobile.setText("");
				}
				break;
			}
		}
	}

   焦点事件很容易理解,不多讲了。最后,我们定义Button的点击事件,在这个事件中,我们让两个EditText的父容器LinearLayout动态获取焦点。效果是,当点击Button时,两个EditText输入框中的内容同时清空。

public void setFocus(View view) {

		edit_layout.setFocusable(true);
		edit_layout.setFocusableInTouchMode(true);

		edit_layout.requestFocus();
		edit_layout.requestFocusFromTouch();
}

    注意下,edit_layout.requestFocus();edit_layout.requestFocusFromTouch();这两行代码是必须添加的,不然LinearLayout是无法获取到焦点的!

    好了,就是如此简单的内容,把整个Activity的代码给大家看下,就不上传源码了。

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;

public class MainActivity extends Activity {

	private static final String TAG = "MainActivity";

	private LinearLayout edit_layout;

	private EditText edit_name;

	private EditText edit_mobile;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		edit_layout = (LinearLayout) findViewById(R.id.edit_layout);
		edit_name = (EditText) findViewById(R.id.edit_name);
		edit_mobile = (EditText) findViewById(R.id.edit_mobile);

		this.edit_name.setOnFocusChangeListener(new OnFocusHandler());
		this.edit_mobile.setOnFocusChangeListener(new OnFocusHandler());
	}

	public void setFocus(View view) {

		edit_layout.setFocusable(true);
		edit_layout.setFocusableInTouchMode(true);

		edit_layout.requestFocus();
		edit_layout.requestFocusFromTouch();
	}

	private class OnFocusHandler implements OnFocusChangeListener {
		@Override
		public void onFocusChange(View v, boolean hasFocus) {
			switch (v.getId()) {
			case R.id.edit_name:

				if (hasFocus) {
					edit_name.setText("ning shuai");
				} else {
					edit_name.setText("");
				}
				break;
			case R.id.edit_mobile:
				if (hasFocus) {
					edit_mobile.setText("963258741");
				} else {
					edit_mobile.setText("");
				}
				break;
			}
		}
	}
}

    看下最后的效果:

    怎么样,了解吧,希望能帮助大家解决某些问题!

时间: 2024-09-14 00:00:38

Android 动态设置控件获取焦点的相关文章

android中设置控件获得焦点

android中,要使控件获得焦点,需要先setFocus,再requestFocus. 以Button为例:                 btn.setFocusable(true);                 btn.setFocusableInTouchMode(true);                 btn.requestFocus();                 btn.requestFocusFromTouch(); //获得失去焦点的监听器 btn.setOn

Android 动态添加控件

 相机源码中 VideoCamera.java: ViewGroup rootView = (ViewGroup) findViewById(R.id.video_camera);         LayoutInflater inflater = this.getLayoutInflater(); View controlBar = inflater.inflate(                     R.layout.attach_camera_control, rootView);

Android学习教程之动态GridView控件使用(6)

本文实例为大家分享了Android动态GridView控件使用的具体代码,供大家参考,具体内容如下 MainActivity.java代码: package siso.haha; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button

android换肤功能 如何动态获取控件中背景图片的资源id?_Android

这个是在在做一个换肤功能时遇到的问题.   对于换肤,网上都有示例,可以从别的皮肤安装包中读取所要的资源,前提是你必须先持有这个资源的引用名称,像R.drawable.background(喂,这不是废话嘛).这个换肤的方案原理就是,自身应用的资源名称是R.drawable.background,那皮肤包中应该也是这个名称,然后通过这个名称获取该资源在皮肤包中的具体id,代码: //先获取本地资源引用名称,type name是R.drawable.background中的"drawable&qu

android代码布局-android 代码中设置控件的垂直居中和两个控件之间的距离。

问题描述 android 代码中设置控件的垂直居中和两个控件之间的距离. 因为数据是动态的 所以所有的控件和布局都是在java代码里面设置 怎样才能让一个控件垂直居中 还有两个控件之间的距离又是怎么设置的啊 求高手指点啊 最好能给点代码 我是新手 说的太笼统了 看不太懂 谢谢了 解决方案 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT,

android控件-android中xml设置控件的属性和java文件里设置控件的属性有何不同

问题描述 android中xml设置控件的属性和java文件里设置控件的属性有何不同 android中xml设置控件设置的属性和java文件里设置控件的属性有何不同 是不是java文件里设置可以改变动态的改变控件位置,文字颜色,文字大小 而在xml文件设置之后就无法改变 那具体在java文件设置的属性是如何改变的呢 解决方案 java中可以重新设置去改变xml的设置.但是xml不能去改变java中的设置. 解决方案二: 你可以这样理解,xml设置以后基本不会改变,如果会改变,就要在java里面设

Android中日期与时间设置控件用法实例_Android

本文实例讲述了Android中日期与时间设置控件用法.分享给大家供大家参考.具体如下: 1.日期设置控件:DatePickerDialog 2.时间设置控件:TimePickerDialog 实例代码: 页面添加两个Button,单击分别显示日期设置控件和时间设置控件,还是有TextView控件,用于显示设置后的系统时间 main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout x

android gridview子类控件如何由于viewgroup获取焦点

问题描述 android gridview子类控件如何由于viewgroup获取焦点 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:descendantFocusability=&q

asp.NET的这个系统的treeview点击后出现的不同模块不同控件,是怎么实现的,是不是通过动态添加控件,可是动态添加控件怎么设置控件的后台代码呢???

问题描述 asp.NET的这个系统的treeview点击后出现的不同模块不同控件,是怎么实现的,是不是通过动态添加控件,可是动态添加控件怎么设置控件的后台代码呢??? 解决方案 解决方案二:把10几年前的这个最基本的入门教程()中的例子全都做一遍,然后再问.解决方案三:引用1楼sp1234的回复: 把10几年前的这个最基本的入门教程()中的例子全都做一遍,然后再问. 果然是大神解决方案四:想必楼主说的是通过treeview实现菜单导航吧,给你一个实例参考