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经常变的情况下累加的时间成本是很高的,而且一不小心,还有可能写错
相关文章
- [Android Pro] android控件ListView顶部或者底部也显示分割线
- Android 判断SIM卡属于哪个移动运营商
- android手写板
- android性能优化之布局优化
- android -7.1去掉设置中的位置信息选项
- android高手进阶教程
- Android kotlin 系列讲解(基础篇) 两个不同的关键字变量声明 - var和val
- Android 11.0 MTK默认授予app的使用wifi和流量的权限
- Android 11.0 Launcher3 去掉底部箭头布局
- Android 11.0第三方app根据包名设置为横屏显示
- Android 9.0 延时开机动画解决首次开机黑屏和去掉android正在启动的提示框
- Android Spinner设置默认选项不起作用的修复
- 【Android 逆向】Android 进程代码注入原理 ( 进程注入原理 | 远程调用流程 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )
- 【Android 内存优化】Bitmap 图像尺寸缩小 ( 设置 Options 参数 | inJustDecodeBounds | inSampleSize | 工具类实现 )
- Android:自己定义PopupMenu的样式(显示图标/设置RadioButton图标)
- Android多开/分身检测
- Android开发实践:如何设置NDK的编译选项