zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android 动态设置控件获取焦点

Android 设置 获取 动态 控件 焦点
2023-09-14 08:56:50 时间

之前写过一篇博客,简单的介绍了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: / 

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


    看下最后的效果:


    怎么样,了解吧,希望能帮助大家解决某些问题!
组件化系列(一)Android动态权限 历史版本权限组件使用的是AndPermission,长期无人维护,历史代码臃肿,不便拓展,考虑使用PermissionsDispatcher,但是PermissionsDispatcher APT插件会影响编译效率,easypermissions侵入性太强,会影响整个工程,RxPermissions 貌似是最佳选择,但是RxPermissions需要高度自定义符合自己项目特色的UI,所以干脆自己写个权限组件好了,希望大家喜欢
使用APICloud开发app的动态权限及Android平台targetSdkVersion设置教程 targetSdkVersion:自2018年11月开始,GooglePlay以及国内大部分应用市场要求app编译目标SDK必须为26及以上,否则不予提交审核;有许多已有app转到APICloud开发后,因targetSdkVersion降级而导致无法覆盖安装;2020年以来,国家网信办等监管机构也加强了对app权限合规的监管。
Android自动化中动态设置网络代理 由于现在很多应用的页面数据都是AI算法推荐生成的,所以每次打开同一个页面数据都会不一样,因此在做客户端UI自动化的过程中都会采用Mock方案,利用MockServer来提供稳定的测试数据,其中MockServer的代理需要手动配置。
拿Android手机举例,过程大致是:进入设置- 进入 WLAN - 找对应 wifi 连接- 进入详情- 找到代理- 选择手动- 输入主机名- 输入端口号- 最后保存,可以看到每次都是重复操作,特别当你的自动化设备很多以及MockServer服务不稳定导致IP经常变的情况下累加的时间成本是很高的,而且一不小心,还有可能写错