android+第三发输入法控制,android输入法属性使用,软键盘隐藏、显示状态控制大揭秘...
經常會遇到需要控制輸入法的情況,如輸入法顯示、隱藏; 輸入法彈出后,界面被頂上去或編輯框被遮擋等問題;下面分為幾個部分總結輸入法屬性設置,及輸入法控制。
一、windowSoftInputMode設置
activity主窗口與軟鍵盤的交互模式,可以用來避免輸入法面板遮擋問題
這個屬性能影響兩件事情:
a. 當有焦點產生時,軟鍵盤是隱藏還是顯示
b. 是否減少活動主窗口大小以便騰出空間放軟鍵盤
【1】 在manifest設置
軟鍵盤顯示或隱藏的屬性有以下幾個選擇:
【A】stateUnspecified:軟鍵盤的狀態(是否它是隱藏或可見)沒有被指定。系統將選擇一個合適的狀態或依賴于主題的設置
【B】stateUnchanged:當這個activity出現時,軟鍵盤將一直保持在上一個activity里的狀態,無論是隱藏還是顯示
【C】stateHidden:當用戶選擇該Activity時,軟鍵盤被隱藏——也就是,當用戶導航到該Activity時,而不是由于離開另一個Activity返回到它。
【D】stateAlwaysHidden:當該Activity主窗口獲取焦點時,軟鍵盤總是被隱藏的;無論是導航到該activity,或是從其他Activity返回到該Activity
stateHidden 與stateAlwaysHidden的區別: 后者,無論何種情況到達該Activity都隱藏輸入法,而前者,只確保首次進入該Activity時隱藏輸入法;
【E】stateVisible:軟鍵盤是可見的,當那個是正常合適的時(當用戶導航到Activity主窗口時)
【F】stateAlwaysVisible:當用戶選擇這個Activity時,軟鍵盤是可見的-- 無論是導航到它,或是由于離開另一個Activity返回到它
這兩者的區別于 hidden和alwaysHiden一樣;
示例:
HomeFragmentActivity的設置:
android:windowSoftInputMode
=
"stateAlwaysHidden|adjustPan" 無論何時到達該界面該界面都隱藏輸入法
FindFriendActivity的設置:
android:windowSoftInputMode
=
"stateVisible|adjustPan", 首次進入該界面時,顯示輸入法; 如果改為
stateAlwaysVisible,那么從其他界面返回該界面時,輸入法也會自動彈出
當前窗口變化模式有以下幾個選擇:
【G】adjustUnspecified:它不被指定是否該Activity主窗口調整大小以便留出軟鍵盤的空間,或是否窗口上的內容得到屏幕上當前的焦點是可見的。系統將自動選擇這些模式中一種主要依賴于是否窗口的內容有任何布局視圖能夠滾動他們的內容。如果有這樣的一個視圖,這個窗口將調整大小,這樣的假設可以使滾動窗口的內容在一個較小的區域中可見的。這個是主窗口默認的行為設置。
【H】adjustResize:該Activity總是調整屏幕的大小以便留出軟鍵盤的空間;即當前窗口的size 會發生變化;
【I】adjustPan:該Activity主窗口并不調整屏幕的大小以便留出軟鍵盤的空間。相反,當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內容的部分,如果輸入法彈出時,焦點不被覆蓋,那么窗口不會自動移動。這個通常是不期望比調整大小,因為用戶可能關閉軟鍵盤以便獲得與被覆蓋內容的交互操作。
【2】代碼設置
windowSoftInputMode也可以在代碼中設置,效果一樣
二、控制輸入法隱藏、顯示 狀態
除了進入Activity時,控制輸入法的顯示/隱藏狀態,在Activity使用過程中,有時也需要手動控制。
【1】 切換輸入法的顯示/隱藏狀態 :
如果輸入法在窗口上已經顯示,則隱藏,反之則顯示
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.
INPUT_METHOD_SERVICE
);
imm.toggleSoftInput(0, InputMethodManager.
HIDE_NOT_ALWAYS
);
該方法優點:無需知道當前窗口是否有焦點,也就無需找到該窗口中能獲取焦點的控件了;
該方法缺點:如果事先不確定輸入法是顯示還是隱藏的狀態,那么該方法可能無法達到預期效果; 只有確定當前輸入法的狀態才能使用該方法;
【2】強制彈出輸入法
imm.showSoftInput(
currentfocusedView
, 0);
【3】強制隱藏輸入法
imm.hideSoftInputFromWindow(
currentfocusedView
.getWindowToken(),
0
)
方法【2】、【3】 必須找到當前具有焦點的控件。 如果當前Activity失去焦點
如彈出對話框,則該Activity無法控制輸入法狀態了,即上面的方法不起任何效果
第一個參數
currentfocusedView是當前窗口具有焦點的控件,一般是EditText;
三、監控輸入法是否彈出
android沒有現成的方法告知上層,輸入法的狀態是顯示的還是隱藏的, 但有時需要根據輸入法的狀態進行一些操作,如 “彈幕”界面,當輸入法彈出時,隱藏彈幕面板,反之顯示;
windowSoftInputMod
e屬性中,
adjustResize模式,在輸入法彈出時,會調整界面大小,可以通過界面大小變化來判斷輸入法是否彈出
【1】自定義界面布局根View
onSizeChanged
中監聽大小變化,高度變小,說明輸入法彈出,反之,輸入法隱藏;
public
class
CheckSoftInputLayout
extends
FrameLayout{
private
OnResizeListener
onResizeListener
;
public
interface
OnResizeListener{
void
OnResize(
int
w,
int
h,
int
oldw,
int
oldh);
}
public
CheckSoftInputLayout(Context context, AttributeSet attrs) {
this
(context, attrs, 0);
}
public
CheckSoftInputLayout(Context context, AttributeSet attrs,
int
defStyle) {
super
(context, attrs, defStyle);
}
public
void
setOnResizeListener(OnResizeListener _listener) {
this
.
onResizeListener
= _listener;
}
@Override
protected
void
onSizeChanged(
int
w,
int
h,
int
oldw,
int
oldh) {
super
.onSizeChanged(w, h, oldw, oldh);
if
(
onResizeListener
!=
null
) {
onResizeListener
.OnResize(w, h, oldw, oldh);
}
}
}
【2】在listener事件中處理
Activity代碼:
rootView
.setOnResizeListener(
new
OnResizeListener() {
@Override
public
void
OnResize(
int
w,
int
h,
int
oldw,
int
oldh) {
if
(h < oldh) {
//輸入法彈出
//todo
}
else
{
//輸入法關閉
//todo
}
}
});
注意:在manifest.xml中,activity的
windowSoftInputMode必須設置為
adjustResize
總結
以上是生活随笔為你收集整理的android+第三发输入法控制,android输入法属性使用,软键盘隐藏、显示状态控制大揭秘...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css 手抓,CSS 像素画 - 手和箭
- 下一篇: Camera 面试总结