Android點(diǎn)擊EditText文本框之外任何地方隱藏鍵盤(pán)的解決辦法
1,實(shí)現(xiàn)方法一:
通過(guò)給當(dāng)前界面布局文件的父layout設(shè)置點(diǎn)擊事件(相當(dāng)于給整個(gè)Activity設(shè)置點(diǎn)擊事件),在事件里進(jìn)行鍵盤(pán)隱藏
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/traceroute_rootview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/white" android:clickable="true" android:gravity="center_horizontal" android:orientation="vertical" > </LinearLayout>
加上id和clickable=true
然后在onCreate里,添加onClick事件的監(jiān)聽(tīng):
findViewById(R.id.traceroute_rootview).setOnClickListener(this);
在onClick中:
@Override public void onClick(View v) { switch (v.getId()) { case R.id.traceroute_rootview: InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); break; } }
這樣就可以完美的解決了輸入框外的隱藏效果,對(duì)于布局不是特別復(fù)雜或是其它觸摸事件少的情況下可以使用。
2,實(shí)現(xiàn)思路二:
通過(guò)dispatchTouchEvent每次ACTION_DOWN事件中動(dòng)態(tài)判斷非EditText本身區(qū)域的點(diǎn)擊事件,然后在事件中進(jìn)行屏蔽。
@Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if (isShouldHideInput(v, ev)) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } return super.dispatchTouchEvent(ev); } // 必不可少,否則所有的組件都不會(huì)有TouchEvent了 if (getWindow().superDispatchTouchEvent(ev)) { return true; } return onTouchEvent(ev); }
isShoudHideInput(View v,MotionEvent e)方法:
public boolean isShouldHideInput(View v, MotionEvent event) { if (v != null && (v instanceof EditText)) { int[] leftTop = { 0, 0 }; //獲取輸入框當(dāng)前的location位置 v.getLocationInWindow(leftTop); int left = leftTop[0]; int top = leftTop[1]; int bottom = top + v.getHeight(); int right = left + v.getWidth(); if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) { // 點(diǎn)擊的是輸入框區(qū)域,保留點(diǎn)擊EditText的事件 return false; } else { return true; } } return false; }
這種方法實(shí)現(xiàn)起來(lái)比較麻煩,解決思路與iOS中的事件分發(fā)機(jī)制是類似,對(duì)于處理隱藏事件比較清晰,通過(guò)層層事件分發(fā),然后判斷是否在需要屏蔽的區(qū)域。
1,實(shí)現(xiàn)方法一:
通過(guò)給當(dāng)前界面布局文件的父layout設(shè)置點(diǎn)擊事件(相當(dāng)于給整個(gè)Activity設(shè)置點(diǎn)擊事件),在事件里進(jìn)行鍵盤(pán)隱藏
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/traceroute_rootview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/white" android:clickable="true" android:gravity="center_horizontal" android:orientation="vertical" > </LinearLayout>
加上id和clickable=true
然后在onCreate里,添加onClick事件的監(jiān)聽(tīng):
findViewById(R.id.traceroute_rootview).setOnClickListener(this);
在onClick中:
@Override public void onClick(View v) { switch (v.getId()) { case R.id.traceroute_rootview: InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); break; } }
這樣就可以完美的解決了輸入框外的隱藏效果,對(duì)于布局不是特別復(fù)雜或是其它觸摸事件少的情況下可以使用。
2,實(shí)現(xiàn)思路二:
通過(guò)dispatchTouchEvent每次ACTION_DOWN事件中動(dòng)態(tài)判斷非EditText本身區(qū)域的點(diǎn)擊事件,然后在事件中進(jìn)行屏蔽。
@Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if (isShouldHideInput(v, ev)) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } return super.dispatchTouchEvent(ev); } // 必不可少,否則所有的組件都不會(huì)有TouchEvent了 if (getWindow().superDispatchTouchEvent(ev)) { return true; } return onTouchEvent(ev); }
isShoudHideInput(View v,MotionEvent e)方法:
public boolean isShouldHideInput(View v, MotionEvent event) { if (v != null && (v instanceof EditText)) { int[] leftTop = { 0, 0 }; //獲取輸入框當(dāng)前的location位置 v.getLocationInWindow(leftTop); int left = leftTop[0]; int top = leftTop[1]; int bottom = top + v.getHeight(); int right = left + v.getWidth(); if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) { // 點(diǎn)擊的是輸入框區(qū)域,保留點(diǎn)擊EditText的事件 return false; } else { return true; } } return false; }
這種方法實(shí)現(xiàn)起來(lái)比較麻煩,解決思路與iOS中的事件分發(fā)機(jī)制是類似,對(duì)于處理隱藏事件比較清晰,通過(guò)層層事件分發(fā),然后判斷是否在需要屏蔽的區(qū)域。
以上所述是小編給大家介紹的Android點(diǎn)擊EditText文本框之外任何地方隱藏鍵盤(pán)的解決辦法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Android實(shí)現(xiàn)三角形氣泡效果方式匯總
這篇文章主要介紹了Android實(shí)現(xiàn)三角形氣泡效果方式匯總,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Android 文件夾顯示紅色嘆號(hào)的解決方法(必看)
下面小編就為大家?guī)?lái)一篇Android 文件夾顯示紅色嘆號(hào)的解決方法(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04Android編程實(shí)現(xiàn)在自定義對(duì)話框中獲取EditText中數(shù)據(jù)的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)在自定義對(duì)話框中獲取EditText中數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Android對(duì)話框數(shù)據(jù)傳遞相關(guān)操作技巧,需要的朋友可以參考下2018-01-01Android webveiw 出現(xiàn)棧錯(cuò)誤解決辦法
這篇文章主要介紹了Android webveiw 出現(xiàn)棧錯(cuò)誤解決辦法的相關(guān)資料,出現(xiàn)java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes,這里提供解決辦法,需要的朋友可以參考下2017-08-08Android 防止過(guò)快(多次)點(diǎn)擊的實(shí)現(xiàn)方法
很多用戶經(jīng)常會(huì)出現(xiàn)過(guò)快且多次點(diǎn)擊同一按鈕的情況,本篇文章主要介紹了Android 防止過(guò)快點(diǎn)擊的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05

Android App開(kāi)發(fā)中自定義View和ViewGroup的實(shí)例教程

android中實(shí)現(xiàn)在ImageView上隨意畫(huà)線涂鴉的方法

Android applicationId和包名的區(qū)別總結(jié)