原理:自定義布局的onSizeChanged()方法,在其中增加一個監(jiān)聽接口,當軟鍵盤顯示或隱藏使得布局尺寸發(fā)生改變,就能捕獲到這個事件。
創(chuàng)新互聯(lián)主營衡東網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app開發(fā),衡東h5成都小程序開發(fā)搭建,衡東網(wǎng)站營銷推廣歡迎衡東等地區(qū)企業(yè)咨詢
具體方法如下:
首先,在清單文件Manifest.xml中的對應(yīng)的Activity標簽內(nèi)設(shè)置
android:windowSoftInputMode=”adjustResize”
作用是當軟鍵盤顯示或隱藏時,該Activity主窗口總是會被調(diào)整大小以便留出軟鍵盤的空間。唯有這樣才能保證布局觸發(fā)onSizeChanged()方法。
然后,自定義一個布局,具體是RelativeLayout、LinearLayout或是其它的,根據(jù)實際情況而定,自定義的目的是在其onSizeChanged()方法中增加一個監(jiān)聽接口。這里給出一個自定義RelativeLayout布局代碼:
public class CustomRelativeLayout extends RelativeLayout {
private OnSizeChangedListener listener;
public CustomRelativeLayout(Context context) {
super(context);
}
public CustomRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
Log.d(TAG.CUSTOM_VIEW, “onSizeChanged”);
super.onSizeChanged(w, h, oldw, oldh);
if (listener != null) {
listener.onSizeChanged(w, h, oldw, oldh);
}
}
public void setOnSizeChangedListener(OnSizeChangedListener listener) {
this.listener = listener;
}
/** * Activity主窗口大小改變時的回調(diào)接口(本示例中,等價于軟鍵盤顯示隱藏時的回調(diào)接口) */
public interface OnSizeChangedListener {
public void onSizeChanged(int w, int h, int oldw, int oldh);
}
}
最后,在程序中使用此接口(xxx.setOnSizeChangedListener(…))即可實現(xiàn)監(jiān)聽鍵盤隱藏或顯示事件。
?在很多Android App 開發(fā)的過程中,需要對Activity 中 軟鍵盤的彈起和關(guān)閉進項監(jiān)聽,但是Andoid中并沒有提供相對應(yīng)的api進行監(jiān)聽, 我有一個簡單的方法。
首先需要知道一些基礎(chǔ)知識
在manifest文件中可以設(shè)置Activity的android:windowSoftInputMode屬性,這個屬性值常見的設(shè)置如下:android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
那么這里值的含義列表如下:
1、stateUnspecified:軟鍵盤的狀態(tài)并沒有指定,系統(tǒng)將選擇一個合適的狀態(tài)或依賴于主題的設(shè)置
2、stateUnchanged:當這個activity出現(xiàn)時,軟鍵盤將一直保持在上一個activity里的狀態(tài),無論是隱藏還是顯示
3、stateHidden:用戶選擇activity時,軟鍵盤總是被隱藏
4、stateAlwaysHidden:當該Activity主窗口獲取焦點時,軟鍵盤也總是被隱藏的
5、stateVisible:軟鍵盤通常是可見的
6、stateAlwaysVisible:用戶選擇activity時,軟鍵盤總是顯示的狀態(tài)
7、adjustUnspecified:默認設(shè)置,通常由系統(tǒng)自行決定是隱藏還是顯示
8、adjustResize:該Activity總是調(diào)整屏幕的大小以便留出軟鍵盤的空間
9、adjustPan:當前窗口的內(nèi)容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內(nèi)容的部分
案例:
1.我們需要將監(jiān)聽所在的Activity在Manifest文件中的設(shè)置為如下形式:
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 需要在外層布局文件設(shè)置一個id,并在activity 中設(shè)置監(jiān)聽
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();
//閥值設(shè)置為屏幕高度的1/3
keyHeight = screenHeight/3;
}
@Override
protected void onResume() {
super.onResume();
//添加layout大小發(fā)生改變監(jiān)聽器
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);
//現(xiàn)在認為只要控件將Activity向上推的高度超過了1/3屏幕高,就認為軟鍵盤彈起
if(oldBottom != 0 bottom != 0 (oldBottom - bottom keyHeight)){
Toast.makeText(MainActivity.this, "監(jiān)聽到軟鍵盤彈起...", Toast.LENGTH_SHORT).show();
}else if(oldBottom != 0 bottom != 0 (bottom - oldBottom keyHeight)){
Toast.makeText(MainActivity.this, "監(jiān)聽到軟件盤關(guān)閉...", Toast.LENGTH_SHORT).show();
}
}
本文來自:
我們在android手機上面有時候會遇到監(jiān)聽手機軟鍵盤按鍵的時候,例如:我們在瀏覽器輸入url完畢后可以點擊軟鍵盤右下角的“GO”按鍵加載url頁面;在點擊搜索框的時候,點擊右下角的search符號鍵可以進行搜索;或者在全部數(shù)據(jù)輸入完畢后,點擊右下角的"done"就馬上進行下一步操作。
function 1:
重寫Activity的dispatchKeyEvent(KeyEvent event)方法,在其中監(jiān)聽KeyEventKey.KEYCODE_ENTER鍵(右下角確定鍵),當此鍵按下的時候,隱藏輸入法軟鍵盤,設(shè)置edittext內(nèi)容和加載webview內(nèi)容。
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if(event.getKeyCode() == KeyEvent.KEYCODE_ENTER){
/*隱藏軟鍵盤*/
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if(inputMethodManager.isActive()){
inputMethodManager.hideSoftInputFromWindow(MainActivity.this.getCurrentFocus().getWindowToken(), 0);
edittext.setText("success");
webview.loadUrl(URL);
return true;
return super.dispatchKeyEvent(event);
}
function 2:
重寫dispatchKeyEvent(KeyEvent event)的方法感覺有點用牛刀的感覺,因為我們非常可能在這個方法中進行其他任務(wù),所以我們可以使用OnKeyListener的方法來監(jiān)聽軟鍵盤按鍵。
private OnKeyListener onKeyListener = new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_ENTER){
/*隱藏軟鍵盤*/
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if(inputMethodManager.isActive()){
inputMethodManager.hideSoftInputFromWindow(v.getApplicationWindowToken(), 0);
edittext.setText("success");
webview.loadUrl(URL);
return true;
return false;
};
edittext.setOnKeyListener(onKeyListener);
function 3:
第三種方法我認為可以幫助程序員更精確的判斷右下角按鍵情況,以便應(yīng)對更加復(fù)雜的情況。它可以幫助程序員依據(jù)當前郵件下為“GO”,“done”,“search”鍵的情況下做出更細分的操作。
edittext.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
/*判斷是否是“GO”鍵*/
if(actionId == EditorInfo.IME_ACTION_GO){
/*隱藏軟鍵盤*/
InputMethodManager imm = (InputMethodManager) v
.getContext().getSystemService(
Context.INPUT_METHOD_SERVICE);
if (imm.isActive()) {
imm.hideSoftInputFromWindow(
v.getApplicationWindowToken(), 0);
edittext.setText("success");
webview.loadUrl(URL);
return true;
return false;
});
Android Compose可謂之新起之秀,用起來真棒,但是目前還在處于穩(wěn)定初期,下面歸納了一些常用方法:
另附一個虛擬鍵盤狀態(tài)監(jiān)聽方法
總結(jié):
1.在ios中軟鍵盤彈起時,僅會引起body的scrollTop值改變,但是我們可以通過輸入框的獲取焦點情況來做判斷,單也只能在ios中采用這個方案,因為在android中存在主動受氣鍵盤后,但輸入框并沒有失去焦點,而ios中鍵盤受氣后就會失去焦點;
2.在androis中軟鍵盤彈起或收起時,會改變window的高度,因此監(jiān)聽window的onresize事件;
一、Android
//獲取原窗口的高度
var originalHeight=document.documentElement.clientHeight ||document.body.clientHeight;
window.onresize=function(){
//鍵盤彈起與隱藏都會引起窗口的高度發(fā)生變化
? var resizeHeight=document.documentElement.clientHeight || document.body.clientHeight;
? ? if(resizeHeight-0originalHeight-0){
? ? //當軟鍵盤彈起,在此處操作
? ? }else{
? ? //當軟鍵盤收起,在此處操作
? ? }
}
二、ios
focusin和focusout支持冒泡,對應(yīng)focus和blur, 使用focusin和focusout的原因是focusin和focusout可以冒泡,focus和blur不會冒泡,這樣就可以使用事件代理,處理多個輸入框存在的情況。
document.body.addEventListener('focusin', () = {
? ? ? ? //軟鍵盤彈出的事件處理
? ? ? ? if(isIphone()){
? ? ? ? }
? ? })
document.body.addEventListener('focusout', () = {
? //軟鍵盤收起的事件處理
? ? if(isIphone()){
? ? }
})
特此聲明文章出處: