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;
			}
		}
	}
}


    看下最后的效果:


    怎么样,了解吧,希望能帮助大家解决某些问题!
相关文章
|
3月前
|
XML API Android开发
码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)
本文介绍了如何使用androidx.preference库快速创建具有一级和二级菜单的Android设置界面的步骤和示例代码。
125 1
码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)
|
1月前
|
XML 存储 Java
浅谈Android的TextView控件
浅谈Android的TextView控件
33 0
|
2月前
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
47 3
|
2月前
|
Android开发
Android经典实战之Textview文字设置不同颜色、下划线、加粗、超链接等效果
本文介绍了 `SpannableString` 在 Android 开发中的强大功能,包括如何在单个字符串中应用多种样式,如颜色、字体大小、风格等,并提供了详细代码示例,展示如何设置文本颜色、添加点击事件等,助你实现丰富文本效果。
260 3
|
3月前
|
Java 网络安全 开发工具
UNITY与安卓⭐一、Android Studio初始设置
UNITY与安卓⭐一、Android Studio初始设置
|
2月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
153 0
|
3月前
|
前端开发 Android开发 开发者
安卓开发中的自定义视图:构建你的第一个控件
【8月更文挑战第26天】在安卓开发的浩瀚海洋中,自定义视图是一块充满魔力的乐土。它不仅是开发者展示创造力的舞台,更是实现独特用户体验的关键。本文将带你步入自定义视图的世界,从基础概念到实战应用,一步步教你如何打造自己的第一个控件。无论你是初学者还是有经验的开发者,这篇文章都将为你的开发之旅增添新的风景。
|
3月前
|
开发工具 Android开发
Android项目架构设计问题之外部客户方便地设置回调如何解决
Android项目架构设计问题之外部客户方便地设置回调如何解决
28 0
|
3月前
|
数据可视化 Java 数据挖掘
Android项目架构设计问题之设置RecyclerView的LayoutManager如何解决
Android项目架构设计问题之设置RecyclerView的LayoutManager如何解决
35 0
|
6天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。