一、系统级设置调整
修改注册表(高级用户) 通过编辑注册表项 `HKEY_CURRENT_USER\Control Panel\Desktop`,调整以下参数:
- `ForegroundLockTimeout`:设置为 `20000`(20秒),程序需等待该时间才能获取焦点。
调整窗口软输入模式
在 `AndroidManifest.xml` 中为活动添加属性:
```xml
```
或者在代码中动态设置:
```java
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
```
*注意:此方法仅适用于启动活动时隐藏软键盘,无法阻止已打开活动的输入框获取焦点。
二、应用级代码控制
设置控件属性
- 布局文件: 为输入框的父布局添加: ```xml android:focusable="true" android:focusableInTouchMode="true" ``` 例如: ```xml android:focusableInTouchMode="true" ... > ``` - 代码设置
```java
EditText editText = findViewById(R.id.editText);
editText.clearFocus();
editText.setFocusable(false);
```
管理焦点生命周期 - 在 `ListView` 或 `RecyclerView` 中,使用 `setFocusable(false)` 避免滚动时获取焦点。
- 使用 `Adapter.notifyDataChanged()` 刷新数据时,避免因数据变化触发焦点重置。
事件拦截与线程控制
- 通过 `ViewTreeObserver.OnGlobalLayoutListener` 监听布局变化,手动控制焦点:
```java
ViewTreeObserver observer = editText.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
editText.clearFocus();
editText.setFocusable(false);
observer.removeOnGlobalLayoutListener(this);
}
});
```
- 避免在主线程中频繁调用 `clearFocus()`,建议使用 `postDelayed` 延时处理。
三、其他注意事项
多窗口与任务切换: 系统级设置会影响所有应用,需谨慎修改注册表。若需针对特定应用调整,可开发自定义窗口类型(如 `Window.FOCUSABLE`)。 虚拟键盘干扰
通过以上方法,可有效控制应用内焦点行为,提升用户体验。