1. 程式人生 > >activity和軟鍵盤遮擋問題

activity和軟鍵盤遮擋問題

今天解決了一個bug,就是魅藍3手機的軟鍵盤不能把dialog樣式的activity頂起來,導致佈局裡的一部分看不到,我在網上查詢解決方案,發現瞭如下幾個方法,一一嘗試了但是都沒用。但是這幾種方案對於解決其它款式的手機應該是有用的。

魅藍3上的效果:

軟鍵盤遮擋

其它手機的正常效果:

軟鍵盤遮擋

以下是網上的解決方案:

總結起來,就是
1、xml佈局檔案配置android:windowSoftInputMode=”引數”
2、程式碼配置android:windowSoftInputMode
3、佈局外層巢狀一個scrollview,這樣當軟鍵盤彈出的時候會把佈局頂上去。而我的魅藍3手機的軟鍵盤根本不能把佈局頂上去,所以這個方法對於魅藍3不可行。
4、自定義佈局,重寫onSizeChanged方法。為了解決這樣的一個小bug要自定義一個佈局,這樣程式碼量比較大,所以我沒有嘗試,不知道在魅藍3上是否可行。

我自己嘗試了前三種方法都不可行。後來我又想,能不能在最外層巢狀一個relativelayout,然後監聽軟鍵盤彈出的狀態,如果彈出就給relativilayout設定一個高度或者設定android:layout_alignParentTop=”true”,讓它的子佈局都可以展示出來,如果軟鍵盤是隱藏的狀態就設定 android:layout_centerInParent=”true”,這樣就不會遮擋住子佈局了,但是這樣做出現了一個異常

RelativeLayoutLayoutParamscannotbecasttoandroid.widget.FrameLayoutLayoutParams

我根據網上的程式碼修改了下還是不對,我沒有搞懂這個異常,所以失敗了。
我也想過給通過判斷軟鍵盤的高度動態的設定margin值來讓佈局正好顯示在軟鍵盤的上方,但是感覺這樣太繁瑣了。

後來我就想了下面這個方法:

if (Build.MODEL.equals("m3")){
            Log.i("LHD","share魅族3手機");
            WindowManager m = getWindowManager();
            Display d = m.getDefaultDisplay(); // 為獲取螢幕寬、高
            android.view.WindowManager.LayoutParams p = getWindow().getAttributes();
            p.height = (int
) (d.getHeight() * 0.5); // 高度設定為螢幕的0.5 p.width = (int) (d.getWidth() * 0.9); // 寬度設定為螢幕的0.8 getWindow().setAttributes(p); }else{ Log.i("LHD","share非魅族3手機"); }

因為我的這個bug只在魅藍3上出現,所以我就獲取手機型號,如果是魅藍3我就給它的activity整體設定寬高來讓佈局顯示出來,最後的效果是這樣:

魅藍3

或者直接設定 p.y=-100;也是可以的,通過設定p.y的值可以調整dialog樣式的activity的位置。

這個解決方案並不完美,在魅藍3的發簡訊的頁面,當輸入簡訊內容的時候就軟鍵盤可以把那個輸入框頂上去。所以我想魅藍3應該可以有辦法讓軟鍵盤把佈局頂上去的,但是現在時間緊張,所以只好先這樣啦。以後再找找原因吧。如果哪位老大知道原因記得留言告訴我下啊。