系统设置 WIFI输入框被挡住解决方案


问题点

进入系统设置-网络和互联网-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 manager
        mWifiManager = (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.java

RK 全志平台路径:

/packages/apps/Settings/src/com/android/settings/wifi/WifiConfigController2.java

在线平台源码位置查看,方便check 源码

/packages/apps/Settings/src/com/android/settings/wifi/WifiConfigController2.java

在线源码查看

部分源码跟踪

首先我们要找到源码位置,如何查找输入密码具体的类和布局

方法

  1. 系统设置->网络和互联网-WLAN连接-WLAN-点击对应的WIFI列表,自己想连接的那个WIFI ITEM
  2. 查看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

  1. 过滤关键字:Switching Launching
 C:\Users\Administrator>adb 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.ConfigureWifiEntryFragment

130|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

  1. ConfigureWifiEntryFragment 中核心代码
ConfigureWifiEntryFragment 中核心代码
View rootView = inflater.inflate(R.layout.wifi_add_network_view


private WifiConfigController2 mUiController;
mUiController = new WifiConfigController2(this, rootView, mWifiEntry, getMode());

所以UI控制中心是在WifiConfigController2 中的

  1. 布局文件wifi_add_network_view
<include
                            android:id="@+id/wifi_dialog_frame"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_above="@id/add_network_button_bar"
                            app:layout_constraintTop_toTopOf="parent"
                            layout="@layout/wifi_dialog"/>

所以对应的布局文件是在@layout/wifi_dialog 中加载的
对应的密码输入框 源码如下:

 <LinearLayout android:id="@+id/password_layout"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    style="@style/wifi_item" >
                <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        style="@style/wifi_item_label"
                        android:text="@string/wifi_password" />

                <EditText android:id="@+id/password"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        style="@style/wifi_item_edit_content"
                        android:singleLine="true"
                        android:password="true"/>
            </LinearLayout>
  1. UI控制中心WifiConfigController2
4 中 已经看到,WifiConfigController2 构造方法里面传递了根布局的view,那么在控制中心就可以通过rootView 获取布局文件下面的所有View 进行控制。
   如下部分获取view 组件的方法,findViewById
        SsidScanButton = (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);
  1. 寻找解决方案
 源码分析后,我们解决方案就是在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中设置一次

我自己调试过,没有用。 这可能跟布局有关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ItJavawfc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值