android鍵盤收起
⑴ Android獲取軟鍵盤高度
在 Android 里我們是無法直接獲取軟鍵盤高度的,但是在某些場景下,我們又需要獲取軟鍵盤的高度。我們可以使用 ViewTreeObserver.OnGlobalLayoutListener 來監聽窗口大小的變化,當軟鍵盤彈出時,窗口高度會變小,使用原始窗口高度減去當前窗口高度,就可以得出軟鍵盤的高度了。
一般我們在 Activity 的 onCreate() 方法中開始監聽:
請注意當 Activity 被銷毀的時候,一定要移除監聽,否則就會產生內存泄漏:
通過以上方法可以實時監聽軟鍵盤的高度變化,特別是像有些輸入法例如搜狗,可以隨時切換拼音輸入、手寫輸入,這個時候軟鍵盤的高度都會發生變化。
除此之外,還可以通過該方法判斷軟鍵盤是否彈出。
⑵ Android 手機軟鍵盤的彈起和關閉的監聽
在很多Android App 開發的過程中,需要對Activity 中 軟鍵盤的彈起和關閉進項監聽,但是Andoid中並沒有提供相對應的api進行監聽, 我有一個簡單的方法。
首先需要知道一些基礎知識
在manifest文件中可以設置Activity的android:windowSoftInputMode屬性,這個屬性值常見的設置如下:android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
那麼這里值的含義列表如下:
1、stateUnspecified:軟鍵盤的狀態並沒有指定,系統將選擇一個合適的狀態或依賴於主題的設置
2、stateUnchanged:當這個activity出現時,軟鍵盤將一直保持在上一個activity里的狀態,無論是隱藏還是顯示
3、stateHidden:用戶選擇activity時,軟鍵盤總是被隱藏
4、stateAlwaysHidden:當該Activity主窗口獲取焦點時,軟鍵盤也總是被隱藏的
5、stateVisible:軟鍵盤通常是可見的
6、stateAlwaysVisible:用戶選擇activity時,軟鍵盤總是顯示的狀態
7、adjustUnspecified:默認設置,通常由系統自行決定是隱藏還是顯示
8、adjustResize:該Activity總是調整屏幕的大小以便留出軟鍵盤的空間
9、adjustPan:當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內容的部分
案例:
1.我們需要將監聽所在的Activity在Manifest文件中的設置為如下形式:
<activity
android:name="com.zy.project.MainActivity"
android:label="@string/app_name"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize" >
<intent-filter>
<action android:name="android.intent.action.MAIN/>
<category android:name="android.intent.category.LAUNCHER/>
</intent-filter>
</activity>
當有軟鍵盤彈起時,Activity的布局大小會被滾動上去,但是你仍然可以通過滑動瀏覽所有。
2 需要在外層布局文件設置一個id,並在activity 中設置監聽
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnLayoutChangeListener;
import android.widget.Toast;
public class MainActivity extends Activity implements OnLayoutChangeListener{
//Activity最外層的Layout視圖
private View rootView;
//屏幕高度
private int screenHeight = 0;
//軟體盤彈起後所佔高度閥值 一般是佔用屏幕的1/3
private int keyHeight = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rootView = findViewById(R.id.root_layout);
//獲取屏幕高度
screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();
//閥值設置為屏幕高度的1/3
keyHeight = screenHeight/3;
}
@Override
protected void onResume() {
super.onResume();
//添加layout大小發生改變監聽器
rootView.addOnLayoutChangeListener(this);
}
@Override
public void onLayoutChange(View v, int left, int top, int right,int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
//old是改變前的左上右下坐標點值,沒有old的是改變後的左上右下坐標點值
// System.out.println(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom);
// System.out.println(left + " " + top +" " + right + " " + bottom);
//現在認為只要控制項將Activity向上推的高度超過了1/3屏幕高,就認為軟鍵盤彈起
if(oldBottom != 0 && bottom != 0 &&(oldBottom - bottom > keyHeight)){
Toast.makeText(MainActivity.this, "監聽到軟鍵盤彈起...", Toast.LENGTH_SHORT).show();
}else if(oldBottom != 0 && bottom != 0 &&(bottom - oldBottom > keyHeight)){
Toast.makeText(MainActivity.this, "監聽到軟體盤關閉...", Toast.LENGTH_SHORT).show();
}
}
本文來自:http://m.blog.csdn.net/bear_huangzhen/article/details/45896333
⑶ 解決安卓收起鍵盤無法觸發失焦事件的問題
最近在做一個移動端 Web 項目,在首頁底部是有一個類似於 APP 導航欄(以下稱 FootNav ),採用的 fixed 布局固定於底部。同時頁面有一些 <input> 輸入框(以下稱 Input )。
當聚焦於 Input 時,在 iOS 預期效果是沒問題,但是在殺千刀的 Android 上,頁面高度發生變化,導致 FootNav 固定在手機鍵盤上面,同時 FootNav 也直接擋住了輸入框,交互體驗非常的糟糕。
煩死了...
先了解下背景,鍵盤的彈出收起,在 iOS 端與 Android 端的 WebView 中表現並非一致的。
針對 Android 設備做處理就行了,iOS 無需處理。
處理方式: Input 聚焦隱藏 FootNav ,失焦時再將其顯示出來 。(同理,修改布局方式也是一樣的)
首先這種處理思路是沒毛病的,但是...
監聽頁面高度的變化,利用這一點我們就可以處理 FootNav 的隱藏/顯示了。
思路很簡單:首先進入頁面時,先記錄窗口的原始高度。每當 Input 聚焦時,設置 window.onresize 函數,當窗口寬高發生改變時便會觸發。
以 React 為例:
The end.
⑷ Android 鍵盤頂起最終完美解決方法
1.在布局底部放置一個透明的 view_Bottom,通隱沒陸過監聽鍵盤彈出修改 view_Bottom的高度實現,鍵盤彈出頂察碼起,鍵盤消失收回 的效果
4.想要不再界面一出現就彈出鍵盤,完善用戶體驗,只要在根布局裡加入灶頃,就能完美解決
Demo連接
⑸ Android 底部按鈕被軟鍵盤頂起問題解決
我們目前的項目是採用單 Activity 多 Fragment 的架構模式, AndroidManifest.xml 內 MainActivity 的配置如下所示。
stateHidden
狀態隱藏,如果我們設置了這個屬性,鍵盤狀態就一定是隱藏的,不管上個界面是什麼狀態,也不管當前界面有沒有輸入的需求,就是不顯示軟鍵盤。
adjustResize
調整大小狀態,這個屬性表示 Activity 的主窗口總是會被調整大小來保證軟鍵盤的顯示空間。如果界面中有可滑動控制項,顯示效果跟 adjustUnspecified 顯示效果一樣;如果界面中沒有可滑動控制項,軟鍵盤可能會蓋住一些控制項(布局的位置不會發生變化,可能獲取了焦點的控制項被軟鍵盤蓋住)。
一般來說,我們的布局分為兩種
第一種布局是不會出現軟鍵盤把底部按鈕頂起的情況,首先軟鍵盤的打開實際上是一個 Dialog,而我們在配置文件內的 adjustResize 屬性是在頁面的根布局 decorView 的子 view 也就是一個線性布局內通過設置 paddingBottom = 軟鍵盤高度,這樣其實相當於把整個滾動布局的高度減少了,所以底部的按鈕也只是變為需要滾動才能看到。
第二種情況通常為一個繼續按鈕始終處於頁面的底部,中間的內容可以滾動,當根布局的內邊距等於軟鍵盤高度時,底部按鈕就看起來像是被頂起。
1、監聽軟鍵盤的打開收起
2、修改 windowSoftInputMode
adjustPan
如果設置了這個屬性,當軟鍵盤彈出的時候,系統會通過布局的移動,來保證用戶要進行輸入的輸入框在用戶的視線范圍內。如果界面沒有可滑動控制項,顯示效果和 adjustUnspecified 效果一樣;如果界面有可滑動控制項,在軟鍵盤顯示的時候,可能會有一些內容顯示不出來。
資料借鑒
Android中Activity的android:windowSoftInputMode屬性