网站域名备案服务,电子商务公司的名字,淘宝流量助手平台,电子商务网站建设合同签订文章目录 问题点复现的场景机器横屏可复现#xff0c;竖屏不存在跟density 相关的。 解决问题方案设置输入模式路径 部分源码跟踪方法 延伸思考设置输入模式设置主题 问题点
进入系统设置-网络和互联网-WLAN-点击WIFI item ,密码输入框被遮挡#xff0c;输入的密码不可见.如… 文章目录 问题点复现的场景机器横屏可复现竖屏不存在跟density 相关的。 解决问题方案设置输入模式路径 部分源码跟踪方法 延伸思考设置输入模式设置主题 问题点
进入系统设置-网络和互联网-WLAN-点击WIFI item ,密码输入框被遮挡输入的密码不可见.如下图
复现的场景
机器横屏可复现竖屏不存在
跟density 相关的。
不同分辨率、不同density 的情形很多。所以并不是所有的机型产品必现的当遇到的识货我们就去解决。 同一台机器分辨率不会变不同density 下部分density 下会出现遮挡问题。 wm density value 命令可以用来调试复现问题。 同一台机器density 设置一样不同固件接不同分辨率的机器部分分辨率下会出现。 wm size value 命令可以来调试复现问题。 实际自己遇到情况如上无论自己接触到的RK、全志、MTK 产品都偶尔会遇到遮挡问题。 原因如上举例所说。
解决问题方案
设置输入模式
在 WifiConfigController2.java 中设置输入模式SOFT_INPUT_ADJUST_PAN 具体代码如下 public WifiConfigController2(WifiConfigUiBase2 parent, View view, WifiEntry wifiEntry,int mode) {mConfigUi parent;mView view;mWifiEntry wifiEntry;mContext mConfigUi.getContext();// Init Wi-Fi managermWifiManager (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);initWifiConfigController2(wifiEntry, mode);(scanForActivitySetSoftInputMode(mContext)).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);}private static Activity scanForActivitySetSoftInputMode(Context cont) {if (cont null)return null;else if (cont instanceof Activity)return (Activity)cont;else if (cont instanceof ContextWrapper)return scanForActivitySetSoftInputMode(((ContextWrapper)cont).getBaseContext());return null;}在构造方法中添加 scanForActivitySetSoftInputMode 方法重新设置键盘模式
路径
MTK 平台下路径
vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/wifi/WifiConfigController2.javaRK 全志平台路径
/packages/apps/Settings/src/com/android/settings/wifi/WifiConfigController2.java在线平台源码位置查看方便check 源码
/packages/apps/Settings/src/com/android/settings/wifi/WifiConfigController2.java在线源码查看
部分源码跟踪
首先我们要找到源码位置如何查找输入密码具体的类和布局
方法
系统设置-网络和互联网-WLAN连接-WLAN-点击对应的WIFI列表自己想连接的那个WIFI ITEM查看logcat 日志打印有很多包名con.android.settings 下的日志我们找到关机日志比如下
SettingsActivity com.android.settings D Switching to fragment com.android.settings.wifi.ConfigureWifiEntryFragment
SubSettings com.android.settings D Launching fragment com.android.settings.wifi.ConfigureWifiEntryFragment
过滤关键字Switching Launching C:\Users\Administratoradb shell
k69v1_64_k419:/ $ logcat | grep Switching
09-29 11:33:18.496 1542 1542 D SettingsActivity: Switching to fragment com.android.settings.network.NetworkDashboardFragment
09-29 11:33:48.098 1542 1542 D SettingsActivity: Switching to fragment com.android.settings.wifi.WifiSettings
09-29 11:34:19.136 1542 1542 D SettingsActivity: Switching to fragment com.android.settings.wifi.ConfigureWifiEntryFragment130|k69v1_64_k419:/ $ logcat | grep Launching
09-29 11:33:18.496 1542 1542 D SubSettings: Launching fragment com.android.settings.network.NetworkDashboardFragment
09-29 11:33:48.098 1542 1542 D SubSettings: Launching fragment com.android.settings.wifi.WifiSettings
09-29 11:34:19.136 1542 1542 D SubSettings: Launching fragment com.android.settings.wifi.ConfigureWifiEntryFragment
可以看到对应的跳转和启动相关Fragment日志这样就追踪到 输入wifi 密码的源码 Fragment 是ConfigureWifiEntryFragment
ConfigureWifiEntryFragment 中核心代码
ConfigureWifiEntryFragment 中核心代码
View rootView inflater.inflate(R.layout.wifi_add_network_viewprivate WifiConfigController2 mUiController;
mUiController new WifiConfigController2(this, rootView, mWifiEntry, getMode());
所以UI控制中心是在WifiConfigController2 中的
布局文件wifi_add_network_view
includeandroid:idid/wifi_dialog_frameandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_aboveid/add_network_button_barapp:layout_constraintTop_toTopOfparentlayoutlayout/wifi_dialog/所以对应的布局文件是在layout/wifi_dialog 中加载的 对应的密码输入框 源码如下 LinearLayout android:idid/password_layoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentstylestyle/wifi_item TextViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentstylestyle/wifi_item_labelandroid:textstring/wifi_password /EditText android:idid/passwordandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentstylestyle/wifi_item_edit_contentandroid:singleLinetrueandroid:passwordtrue//LinearLayoutUI控制中心WifiConfigController2
在4 中 已经看到WifiConfigController2 构造方法里面传递了根布局的view,那么在控制中心就可以通过rootView 获取布局文件下面的所有View 进行控制。如下部分获取view 组件的方法findViewByIdSsidScanButton (ImageButton) mView.findViewById(R.id.ssid_scanner_button);mIpSettingsSpinner (Spinner) mView.findViewById(R.id.ip_settings);mIpSettingsSpinner.setOnItemSelectedListener(this);mProxySettingsSpinner (Spinner) mView.findViewById(R.id.proxy_settings);mProxySettingsSpinner.setOnItemSelectedListener(this);mSharedCheckBox (CheckBox) mView.findViewById(R.id.shared);mMeteredSettingsSpinner mView.findViewById(R.id.metered_settings);mHiddenSettingsSpinner mView.findViewById(R.id.hidden_settings);mPrivacySettingsSpinner mView.findViewById(R.id.privacy_settings);寻找解决方案 源码分析后我们解决方案就是在view 中设置输入模式SOFT_INPUT_ADJUST_PAN添加一个方法在构造方法中去添加 方法设置一次。private static Activity scanForActivitySetSoftInputMode(Context cont) {if (cont null)return null;else if (cont instanceof Activity)return (Activity)cont;else if (cont instanceof ContextWrapper)return scanForActivitySetSoftInputMode(((ContextWrapper)cont).getBaseContext());return null;}
延伸思考
设置输入模式
既然是 设置输入模式我们在Activity里面设置一次不就可以了吗 比如Activity里面硬编码设置一次
设置主题
输入模式里面通过配置文件AndroidMenifest中设置一次
我自己调试过没有用。 这可能跟布局有关系。