立即注册
查看: 1562|回复: 3

[展讯开发资料] 展讯SC9863A/SC9832E/SC7731E/UMS312常见问题介绍及CTS case分析

已绑定手机
发表于 2022-1-18 11:10:15 | 显示全部楼层 |阅读模式 来自 广东省深圳市
1.Android View常见问题介绍
1.1 Android 焦点问题
在 view 获取某控件需通过焦点来做一些事情,EditText 做个案例;
1.触摸设备上通常默认情况下只有 EditText 控件是有焦点,通过获取焦点来调起输入法
2.通常会遇到的一个问题就是当使用弹出框时带有 Edittext 时,此时无焦点,导致输入法无法 弹出;
3.在 AndroidP 以下使用时具 EditText 的界面是可以获取焦点,键盘会自动弹出;
关于调取输入法有很多种,这里只写一种方案: public class MainActivity extends Activity {
private EditText et1; @Override protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1 = (EditText) findViewById(R.id.et1); //通过获取 isFocused 来判断当前 view 是否获取焦点;
If(!et1.isFocused()){
et1.setFocusable(true);
et1.setFocusableInTouchMode(true); //如果不执行 requestFocus 的话,即使设置 Focusable=true 也是不会自动弹出软件盘
et1.requestFocus(); //显示软键盘,注意这个 this,指的是当前所显示的 window;
this.getWindow().setSoftInputMode(WindowManager.
LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); }
}
平台案例 创建 APN 界面,点击任意选项弹出输入框,锁屏解锁后焦点消失
案例分析:在平台上又时候会遇见为什么更改 sdk 的等级后输入法获取焦点则也无法弹出了呢?原因在 google在AndroidP上做了更改;
commit bdc66cb5a0ef513f4306edf9156cc978b08e06e4 Author: Evan Rosky <erosky@google.com>
Date: Fri Sep 8 14:27:24 2017 -0700 Enable new initial-focus behavior for P This means that, by default, nothing gets initial focus
in touch-mode In order to have something focused in touch mode at activity start, an app must explicitly provide a <requestFocus /> tag. Since this tag uses the "default" focus mechanism, it can be placed in a parent and focus will go to whatever view is the default focusable in
that hierarchy. This takes effect for targetApi >= P
目的是为了能在启动 activity 时能够把焦点集中,如果想直接在 EditText 上获取焦掉,就必须通 过 requestFocus 来更新焦点,从而是当前 EditText 初始创建时直接可获取; 如:在默认创建就让 EdiText 获取焦掉可通过 et1.requestFocus()方法即可更新; 下面我们来看一下 Framework 是怎么做的; core/java/android/view/ViewRootImpl.java //在 android P 以下默认是 true,也就是只有在 sdk 小于P的时后才 true,否则为 false; - sAlwaysAssignFocus = true; + sAlwaysAssignFocus = mTargetSdkVersion < Build.VERSION_CODES.P; @Override public void focusableViewAvailable(View v) { checkThread();
if (mView != null) {
if (!mView.hasFocus()) { //通过执行 focusableViewAvailable 让 view 获取焦点;
- if (sAlwaysAssignFocus) { + if (sAlwaysAssignFocus || !isInTouchMode()) {
v.requestFocus();
}

1.2 Android 事件派发
关于 view 事件派发问题,首先要知道的是他主要有三种事件分发,它的调用顺序分别为,dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent;
1、当点击事件产生会先调用 view 的 dispatchTouchEvent,由于 ViewGroup 重写了父 view 事件,则首先会调用他内部的 dispatchTouchEvent,也就是 viewGroup 的 dispacth,
2、viewGroup 内部有一个 onInterceptTouchEvent 事件,如果返回 true,则表示它要拦截此 事件,事件就会交给 onTouchEvent,如果返回 false,则不拦截此事件,则继续向子 view 进行事件传 递,子 view 的 dispatchTouchEvent 则会调用,如不处理则反复执行,直到事件最终被处理;
3.当一个 view 需要处理事件时,如设置 OnTouchlistener 返回为 true,则不会执行onTouchEvent 事件,同时 view 的 onClickeListener 事件也不会相应;

更多详细内容请下载附件查看
2022-1-18 11:09 上传
文件大小:
974.26 KB
下载次数:
5
本地下载

16RD supports Paypal , Payment is calculated at the exchange rate of the day. Unable to download please contact 18902843661 (WhatsApp OR wechat number)

关于一牛网在微软浏览器(Microsoft Edge、IE浏览器)警报通告&解决方案!(无法下载直接更换浏览器即可)

*附件为作者发布,与本站无关,如有侵权,请联系客服删除

已绑定手机
发表于 2022-1-20 16:07:28 | 显示全部楼层 来自 浙江省嘉兴市
看看资料先
已绑定手机
发表于 2022-2-5 15:11:54 | 显示全部楼层 来自 广东省深圳市
谢谢分享
已绑定手机
发表于 2023-10-5 12:00:15 | 显示全部楼层 来自 亚太地区
真挚感谢您的帮助,谢谢楼主!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

合作/建议

TEL: 19168984579

工作时间:
周一到周五 9:00-11:30 13:30-19:30
  • 扫一扫关注公众号
  • 扫一扫打开小程序
Copyright © 2013-2024 一牛网 版权所有 All Rights Reserved. 帮助中心|隐私声明|联系我们|手机版|粤ICP备13053961号|营业执照|EDI证
在本版发帖搜索
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表