原文鏈接:徹底搞定Android開發(fā)中軟鍵盤的常見問題
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),羅甸企業(yè)網(wǎng)站建設(shè),羅甸品牌網(wǎng)站建設(shè),網(wǎng)站定制,羅甸網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,羅甸網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
軟件盤的本質(zhì)是什么?軟鍵盤其實是一個Dialog。
InputMethodService為我們的輸入法創(chuàng)建了一個Dialog,并且將該Dialog的Window的某些參數(shù)(如Gravity)進行了設(shè)置,使之能夠在底部或者全屏顯示。當(dāng)我們點擊輸入框時,系統(tǒng)對活動主窗口進行調(diào)整,從而為輸入法騰出相應(yīng)的空間,然后將該Dialog顯示在底部,或者全屏顯示。
軟鍵盤顯示的調(diào)整
Android 定義了一個屬性,名字為windowSoftInputMode, 這個屬性用于設(shè)置Activity主窗口與軟鍵盤的交互模式,用于避免軟鍵盤遮擋內(nèi)容的問題。我們可以在AndroidManifet.xml中對Activity進行設(shè)置。如:android:windowSoftInputMode=”stateUnchanged|adjustPan”。 該屬性可選的值有兩部分,一部分為軟鍵盤的狀態(tài)控制,控制軟鍵盤是隱藏還是顯示,另一部分是Activity窗口的調(diào)整,以便騰出空間展示軟鍵盤。 android:windowSoftInputMode的屬性設(shè)置必須是下面中的一個值,或一個”state”值加一個”adjust”值的組合,各個值之間用 | 分開。
stateUnspecified-未指定狀態(tài) :當(dāng)我們沒有設(shè)置android:windowSoftInputMode屬性的時候,軟件默認(rèn)采用的就是這種交互方式,系統(tǒng)會根據(jù)界面采取相應(yīng)的軟鍵盤的顯示模式。
stateUnchanged-不改變狀態(tài) :當(dāng)前界面的軟鍵盤狀態(tài),取決于上一個界面的軟鍵盤狀態(tài),無論是隱藏還是顯示。
stateHidden-隱藏狀態(tài) :當(dāng)設(shè)置該狀態(tài)時,軟鍵盤總是被隱藏,不管是否有輸入的需求。
stateAlwaysHidden-總是隱藏狀態(tài) :當(dāng)設(shè)置該狀態(tài)時,軟鍵盤總是被隱藏,和stateHidden不同的是,當(dāng)我們跳轉(zhuǎn)到下個界面,如果下個頁面的軟鍵盤是顯示的,而我們再次回來的時候,軟鍵盤就會隱藏起來。
stateVisible-可見狀態(tài) :當(dāng)設(shè)置為這個狀態(tài)時,軟鍵盤總是可見的,即使在界面上沒有輸入框的情況下也可以強制彈出來出來。
stateAlwaysVisible-總是顯示狀態(tài) :當(dāng)設(shè)置為這個狀態(tài)時,軟鍵盤總是可見的,和stateVisible不同的是,當(dāng)我們跳轉(zhuǎn)到下個界面,如果下個頁面軟鍵盤是隱藏的,而我們再次回來的時候,軟鍵盤就會顯示出來。
adjustUnspecified-未指定模式 :設(shè)置軟鍵盤與軟件的顯示內(nèi)容之間的顯示關(guān)系。當(dāng)你跟我們沒有設(shè)置這個值的時候,這個選項也是默認(rèn)的設(shè)置模式。在這中情況下,系統(tǒng)會根據(jù)界面選擇不同的模式。
adjustResize-調(diào)整模式 :該模式下窗口總是調(diào)整屏幕的大小用以保證軟鍵盤的顯示空間;這個選項不能和adjustPan同時使用,如果這兩個屬性都沒有被設(shè)置, 系統(tǒng)會根據(jù)窗口中的布局自動選擇其中一個 。
adjustPan-默認(rèn)模式 :該模式下通過不會調(diào)整來保證軟鍵盤的空間,而是采取了另外一種策略,系統(tǒng)會通過布局的移動,來保證用戶要進行輸入的輸入框肯定在用戶的視野范圍里面,從而讓用戶可以看到自己輸入的內(nèi)容。
案例
沒有滾動布局xml
對于沒有滾動控件的布局來說,adjustPan就是默認(rèn)的設(shè)置,比如我們案例應(yīng)用中的文本輸入8,上面的文本輸入框123和按鈕都會被頂上去,且頁面布局不可以滾動。
對于沒有滾動控件的布局來說,整個布局會網(wǎng)上偏移(包括標(biāo)題等)以保證輸入框的可見。如果有滾動控件,那么就是內(nèi)容網(wǎng)上偏移,標(biāo)題不會動,還可以通關(guān)滾動來查看被頂上去的內(nèi)容,而這點是不可滾動的布局所不具備的
有滾動布局xml
對于有滾動控件的布局,則是采用的adjustResize方式,比如我們案例應(yīng)用中的文本輸入8,上面的文本輸入框123和按鈕都會被頂上去, 可以通過滾動來查看被頂上去的內(nèi)容。
** 根據(jù)這一原理,我們就可以把開發(fā)中遇到的軟鍵盤遮擋頁面的問題,利用ScrollView當(dāng)做根布局,讓系統(tǒng)采用adjustResize模式,很好地解決這一問題。**
自動彈出軟鍵盤
有時候需要一進入Activity后就自動彈出軟鍵盤,可以通過設(shè)置一個時間函數(shù)來實現(xiàn),具體寫法如下:
方法一:
方法二:
有時進入Activity后不希望系統(tǒng)自動彈出軟鍵盤,我們可以按照下面的方法來實現(xiàn):
方法一:
在AndroidMainfest.xml中選擇那個activity,設(shè)置windowSoftInputMode屬性為adjustUnspecified|stateHidden
方法二:
讓EditText失去焦點,使用EditText的clearFocus方法
方法三:
強制隱藏Android輸入法窗口
方法四:
EditText始終不彈出軟件鍵盤
EditText設(shè)置ScrollView壓縮背景圖片解決辦法
在你的Activity里加上
有時希望根據(jù)條件動態(tài)關(guān)閉軟鍵盤,我們可以使用InputMethodManager類,按照下面的方法來實現(xiàn):
方法一:
方法二:
強制隱藏軟鍵盤,這個方法倒是很實用。
方法三:
方法四:
在onclick事件下.以下方法可行.(如果是EditText失去焦點/得到焦點,沒有效果)
InputMethodManager的具體用法可以參考下面的鏈接:
使用android:imeOptinos可對Android自帶的軟鍵盤進行一些界面上的設(shè)置:
android:imeOptions="flagNoExtractUi" //使軟鍵盤不全屏顯示,只占用一部分屏幕
同時,這個屬性還能控件軟鍵盤右下角按鍵的顯示內(nèi)容,默認(rèn)情況下為回車鍵
android:imeOptions="actionNone" //輸入框右側(cè)不帶任何提示 android:imeOptions="actionGo" //右下角按鍵內(nèi)容為'開始' android:imeOptions="actionSearch" //右下角按鍵為放大鏡圖片,搜索 android:imeOptions="actionSend" //右下角按鍵內(nèi)容為'發(fā)送' android:imeOptions="actionNext" //右下角按鍵內(nèi)容為'下一步' android:imeOptions="actionDone" //右下角按鍵內(nèi)容為'完成'
同時,可能EditText添加相應(yīng)的監(jiān)聽器,捕捉用戶點擊了軟鍵盤右下角按鈕的監(jiān)聽事件,以便進行處理。
開發(fā)中有個需求是將頁面底部的一個按鈕頂起,但是開發(fā)時發(fā)現(xiàn)Android5.0以后的版本設(shè)置了adjustResize屬性后無法成功頂起。糾結(jié)了好久,最后在stackoverflow找到解決方案,那就是在根布局上加上fitsSystemWindow=”true”即可。
這里的fitsSystemWindow具體的作用就是你的**contentview是否忽略actionbar,title,屏幕的底部虛擬按鍵,將整個屏幕當(dāng)作可用的空間。 **
正常情況,contentview可用的空間是去除了actionbar,title,底部按鍵的空間后剩余的可用區(qū)域;這個屬性設(shè)置為true,則忽略,false則不忽略
在edittext上加入Android:imeOptions=”actionSearch”這個屬性沒響應(yīng),最后發(fā)現(xiàn)在2.3及以上版本不起作用,解決方案:加上
因為輸入法鍵盤右下角默認(rèn)的回車鍵本來就是換行用的,當(dāng)設(shè)置單行后,回車換行就失去作用了,這樣就可以設(shè)置為搜索、發(fā)送、go等等。
?在很多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:當(dāng)這個activity出現(xiàn)時,軟鍵盤將一直保持在上一個activity里的狀態(tài),無論是隱藏還是顯示
3、stateHidden:用戶選擇activity時,軟鍵盤總是被隱藏
4、stateAlwaysHidden:當(dāng)該Activity主窗口獲取焦點時,軟鍵盤也總是被隱藏的
5、stateVisible:軟鍵盤通常是可見的
6、stateAlwaysVisible:用戶選擇activity時,軟鍵盤總是顯示的狀態(tài)
7、adjustUnspecified:默認(rèn)設(shè)置,通常由系統(tǒng)自行決定是隱藏還是顯示
8、adjustResize:該Activity總是調(diào)整屏幕的大小以便留出軟鍵盤的空間
9、adjustPan:當(dāng)前窗口的內(nèi)容將自動移動以便當(dāng)前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內(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
當(dāng)有軟鍵盤彈起時,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是改變前的左上右下坐標(biāo)點值,沒有old的是改變后的左上右下坐標(biāo)點值
// System.out.println(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom);
// System.out.println(left + " " + top +" " + right + " " + bottom);
//現(xiàn)在認(rèn)為只要控件將Activity向上推的高度超過了1/3屏幕高,就認(rèn)為軟鍵盤彈起
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();
}
}
本文來自:
1、//隱藏軟鍵盤
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(WidgetSearchActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
2、//顯示軟鍵盤,控件IDEditText,TextView
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).showSoftInput(控件ID, 0);
-
Android要關(guān)閉EditText中的軟鍵盤,要分以下兩種情況。分別是EditText有焦點(focusable為true)和當(dāng)EidtText無焦點(focusable=false)。
1、EditText有焦點(focusable為true)阻止輸入法彈出?
先綁定EditText的資源id然后設(shè)置setOnTouchListener監(jiān)聽方法,在該方法里設(shè)置
關(guān)閉軟鍵盤 (setInputType(InputType.TYPE_NULL); )方法。代碼如下。
editText=(EditText)findViewById(R.id.txtBody);
editText.setOnTouchListener(new?OnTouchListener()?{
public?boolean?onTouch(View?v,?MotionEvent?event)?{
editText.setInputType(InputType.TYPE_NULL);?//?關(guān)閉軟鍵盤
return?false;
}
});???
2、當(dāng)EidtText無焦點(focusable=false)時阻止輸入法彈出。
這種情況先得到InputMethodManager類(InputMethodManager這個類來可以實現(xiàn)對軟盤的控制),得到該類之后之間調(diào)用hideSoftInputFromWindow()方法即可。
InputMethodManager?imm?=?(InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(),?0);???
分享名稱:android關(guān)閉軟鍵盤,安卓禁用鍵盤
URL地址:http://aaarwkj.com/article38/dsieppp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、手機網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、網(wǎng)站設(shè)計、移動網(wǎng)站建設(shè)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)