關於Android輸入法彈窗bug的優雅處理

前言

最近發現一個bug,在項目中的某個界面,每當彈出輸入法時,背景總是隨著輸入法上移,導致背景被壓縮,雖然不打緊,但發現這個bug之後極其不愉快。

別人傢的產品處理

隨手拿瞭一部手機舉例

搜索框應該在頂部,這樣即使彈出輸入法也不會遮擋

掘金評論類似的輸入框在底部,輸入內容時,輸入框跟隨輸入法上移,背景不動

wechat聊天界面,背景不動,輸入框和聊天記錄隨著輸入法上移

這三種情況基本上涵蓋瞭大部分包含輸入框的場景,所以接下來我們看怎麼實現它們。

實現

輸入框在頂部的代碼就不講瞭。

掘金的輸入框彈窗實現

大傢能夠很簡單的看出掘金的彈窗是比較復雜的,還可以插入圖片和表情。

並且在彈窗出來之後,原本的文章是不可以滑動的。

由此可以判斷出掘金評論的彈窗是個Dialog,並且是Dialog主題的Activity

那我們來驗證一下。

這個彈窗的Activity叫 TransparentCommentActivityNew 對不對?

文章詳情的Activity叫 DetailActivity 對不對?

@掘金安卓開發人員

這樣就很簡單瞭,當出現瞭新的Activity後,就無須考慮原先Activity背景壓縮的問題,佈局適配的問題。

因為一切都是在新的Activity中進行,並且操作不瞭下面的Activity。

總結:新建一個彈窗主題的Activity可以簡單方便的解決輸入法引起的佈局錯亂問題。

weChat聊天背景不會被壓縮的問題

我遇到瞭一個問題解決瞭很久。就是正常情況的佈局,背景是會被輸入法壓縮的。

看代碼:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@mipmap/test">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal">

        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="請輸入..." />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="提交" />
    </LinearLayout>

</RelativeLayout>

效果圖(可以看到月亮被壓縮瞭):

解決方法

方法一

在AndroidManifest.xml文件裡面的Activity配置:

android:windowSoftInputMode=”adjustResize|stateHidden”

在onCreate方法中設置背景,替代xml中的背景:

getWindow().setBackgroundDrawableResource(R.mipmap.test);

方法二

在AndroidManifest.xml文件裡面的Activity配置:

android:windowSoftInputMode=”adjustResize|stateHidden”

2. 佈局文件設置自定義背景

   <com.myapplication.MyBackground
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@mipmap/test" />
public class MyBackground extends RelativeLayout {
    private Context mContext;
    public MyBackground(Context context) {
        super(context);
        mContext = context;
    }

    public MyBackground(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
    }

    public MyBackground(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mContext = context;
    }

    public MyBackground(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        mContext = context;
    }

    @Override

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        DisplayMetrics dm = new DisplayMetrics();
        WindowManager mWm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        mWm.getDefaultDisplay().getMetrics(dm);
        int screenHeight = dm.heightPixels;
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(screenHeight, MeasureSpec.EXACTLY);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

方法三

在AndroidManifest.xml文件裡面的Activity配置:

android:windowSoftInputMode=”adjustNothing|stateHidden”

動態計算輸入框的高度,在輸入法彈窗彈出時給EditText下方增加一個高度相等的View,輸入法消失時消失該View。

總結

到此這篇關於Android輸入法彈窗bug的優雅處理的文章就介紹到這瞭,更多相關Android輸入法彈窗處理內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: