android顯示軟鍵盤
『壹』 如何在Android中判斷軟鍵盤是否彈出或隱藏
java">Android中判斷軟鍵盤是否彈出或隱藏可以藉助軟鍵盤顯示和隱藏時,對主窗口進行了重新布局這個特性來進行偵聽。如果我們設置的模式為壓縮模式,那麼我們可以對布局的onSizeChanged函數進行跟蹤,如果為平移模式,那麼該函數可能不會被調用。
假設跟布局為線性布局,模式為壓縮模式,我們寫一個例子,當輸入法彈出時隱藏某個view,輸入法隱藏時顯示某個view。
{
;
{
voidOnResize(intw,inth,intoldw,intoldh);
}
publicvoidsetOnResizeListener(OnResizeListenerl){
mListener=l;
}
publicResizeLayout(Contextcontext,AttributeSetattrs){
super(context,attrs);
}
@Override
protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){super.onSizeChanged(w,h,oldw,oldh);
if(mListener!=null){
mListener.OnResize(w,h,oldw,oldh);
}
}
}
『貳』 android彈出軟鍵盤是的布輸入框壓縮,怎麼解決
方法一:在你的activity中的oncreate中setContentView之前寫上這個代碼getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
方法二:在項目的AndroidManifest.xml文件中界面對應的<activity>里加入android:windowSoftInputMode="stateVisible|adjustResize",這樣會讓屏幕整體上移。如果加上的是
android:windowSoftInputMode="adjustPan"這樣鍵盤就會覆蓋屏幕。
方法三:把頂級的layout替換成ScrollView,或者說在頂級的Layout上面再加一層ScrollView的封裝。這樣就會把軟鍵盤和輸入框一起滾動了,軟鍵盤會一直處於底部。
註:方法一和二是同一種方法,不過一個是在代碼里實現一個是在xml文件里實現。可能會應為1.5和之前的版本不支持該方法。但是方法三是肯定沒有問題的。
『叄』 【轉】Android軟鍵盤的全面解析
軟鍵盤其實是一個Dialog
InputMethodService為我們的輸入法創建了一個Dialog,並且對某些參數進行了設置,使之能夠在底部或者全屏顯示。當我們點擊輸入框時,系統會對當前的主窗口進行調整,以便留出相應的空間來顯示該Dialog在底部,或者全屏。
其實這段話我們經常在各種軟鍵盤博客所看到,但是大家並不知道Android是怎麼為我們創建的這個Dialog,所以我先帶大家來看下軟鍵盤生成這塊的源碼,了解軟鍵盤的生成流程。
我們先來看一下InputMethodService的繼承關系:
因為InputMethodService屬於服務,接下來我們先看一下服務的入口onCreate()方法:
通過上面的分析,我們懷疑這里的SoftInputWindow是軟鍵盤彈出創建的Dialog對象,下面我們看下SoftInputWindow的源碼。
看到這里大家就能明白了,為什麼說軟鍵盤就是一個Dialog。而且這里通過設置Gravity.BOTTOM來控制當前Dialog在Window中的位置。
在Android中,可以通過給Activity設置 windowSoftInputMode 這個屬性來控制軟鍵盤與Activity的主窗口的交互方式。
Activity 的主窗口與包含屏幕軟鍵盤的窗口的交互方式,該屬性的設置影響兩個方面:
該設置必須是下面所列的值之一,或者是一個「state…」值加上一個「adjust…」值的組合,在任一組中設置多個值(例如,多個「state…」值)都會產生未定義結果。各值之間使用垂直條 (|) 分隔。
下面將通過例子來介紹 adjustNoting 、 adjustUnspecified 、 adjustResize 、 adjustPan 在軟鍵盤彈出的區別:
非滾動布局xml
點擊最下面的EditText12
滾動布局xml
通過上面的例子,我們可以完全理解adjust系列的各個參數的作用。而軟鍵盤的顯示和隱藏這裡面需要並不多,而且內容並不算復雜,大家回去自己嘗試下就可以。
在日常開發中,如果需要將軟鍵盤的Enter鍵更改為其他鍵,可以設置其 android:imeOptions 屬性,這個屬性可以控制軟鍵盤的Enter鍵,以及橫屏情況下的軟鍵盤顯示狀態。
該設置必須是下面所列的值之一,或者是一個「action…」值加上一個「flag…」值的組合,在action…組中設置多個值(例如,多個「action…」值)都會產生未定義結果,而flag….可以設置多個。各值之間使用垂直條 (|) 分隔
控制軟鍵盤上的Enter鍵
橫屏下控制軟鍵盤
總結一下:
這里大部分的屬性,已經介紹完畢,如果英語好的同學,可以去看下官方文檔,可以更好的理解,並且本文以搜狗輸入法為實踐,可能其他的輸入法與其顯示的不同,但是功能應該都是一樣的。
而如果要在橫屏狀態不希望軟鍵盤全屏顯示最好是將flagNoFullscreen和flagNoExtractUi結合使用,這樣體驗上會更好
android:imeOptions=」flagNoFullscreen|flagNoExtractUi」
Android官網的Api
如果需要監聽軟鍵盤的右下角的按鍵,需要為EditText設置setOnEditorActionListener()監聽:
上面的方式,只是展示了如何監聽各個按鍵的方法,如果需要消費事件,則需要return true。
(1)第一次寫這么長的博客,感覺會有一些不足,各位看官如果有不合理的地方,或者有誤的地方請直接指出。
(2)本來想整理成一個Demo的,後來簡單看來下,該有的幾乎都貼出來了,有需要的可以按需復制就可以。
(3)寫完這篇博客之後,感覺博客干貨還是不多,所以定位這篇文章算是總結性質加上實際案例性質的博客。
(4)Android軟鍵盤的總結就差不多到這里,希望各位看官,如果看到這里有收獲,就點點贊,灌灌水,頂一波,這樣博主才有寫下去的動力。
(5)感謝小輝同學的校驗,調整了文章中不通順的地方。
1.徹底搞定Android開發中軟鍵盤的常見問題
http://blog.csdn.net/mynameishuangshuai/article/details/51567357
2.Android UI(EditText)詳解
http://blog.csdn.net/qq_28057577/article/details/51919965?locationNum=12&fps=1
3.微信軟鍵盤布局閃動問題
https://blog.dreamtobe.cn/2015/09/01/keyboard-panel-switch/
『肆』 android 怎麼讓鍵盤彈出
Android軟鍵盤強制彈出及隱藏輸入法的方法:
很多應用中對於一個界面比如進入搜索界面或者修改信息等等情況,為了用戶體驗應該自動彈出軟鍵盤而不是讓用戶主動點擊輸入框才彈出(因為用戶進入該界面必然是為了更改信息)。具體實現這種效果的代碼如下:
java代碼
EditText editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
editText.requestFocus();
InputMethodManager inputManager =
(InputMethodManager)editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(editText, 0);
首先要對指定的輸入框請求焦點。然後調用輸入管理器彈出軟鍵盤。
警告:對於剛跳到一個新的界面就要彈出軟鍵盤的情況上述代碼可能由於界面為載入完全而無法彈出軟鍵盤。此時應該適當的延遲彈出軟鍵盤如998毫秒(保證界面的數據載入完成)。實例代碼如下:
java代碼:
Timer timer = new Timer();
timer.schele(new TimerTask()
{
public void run()
{
InputMethodManager inputManager =
(InputMethodManager)editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(editText, 0);
}
},
998);
『伍』 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
『陸』 android 濡備綍璁╄蔣閿鐩樿嚜鍔ㄥ脊鍑猴紵
鍙浠ラ氳繃涓嬮潰鐨勪唬鐮佹潵瀹炵幇Android鑷鍔ㄥ脊鍑鴻蔣閿鐩橈細
edittext.requestFocus(); //edittext鏄涓涓狤ditText鎺т歡
Timer timer = new Timer(); //璁劇疆瀹氭椂鍣
timer.schele(new TimerTask() {
@Override
public void run() { //寮瑰嚭杞閿鐩樼殑浠g爜
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(edittext, InputMethodManager.RESULT_SHOWN);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);
}
}, 300); //璁劇疆300姣縐掔殑鏃墮暱
璇存槑錛氬悓鏍鋒槸鍦ㄥ啓Techo Lite鏃墮亣鍒扮殑闂棰樸傚笇鏈涚▼搴忓彲浠ヨ嚜鍔ㄥ脊鍑鴻蔣閿鐩橈紝鍙鏄灝濊瘯浜嗗悇縐嶅姙娉曢兘娌℃湁鏁堟灉銆傞棶棰樼殑鍘熷洜浼間箮鏄蹇呴』絳夊緟UI緇樺埗瀹屾垚鍚庡脊鍑鴻蔣閿鐩樼殑浠g爜鎵嶄細鏈夋晥銆備簬鏄灝遍噰鐢ㄤ簡涓婇潰鐨勬柟娉曘傞渶瑕佹敞鎰忕殑鏄錛屽湪姝や箣鍓嶅繀欏昏〆dittext鑾峰彇鐒︾偣錛屼笉鐒朵篃鏄鏃犳晥鐨勩