こんにちはまず最初に興味深い質問をありがとう。それは私にコードを実験させました。ここで私は私の解決策を説明しています。
解決策を見つけるために私は2つのことを知らなければなりませんでした
1.ソフトキーボードが表示されているかどうかを検出する方法
2.ソフトキーボードを表示または非表示に設定する方法。
少し検索した後、次の手順で解決策を得ましたsoftkeyboardstate
。 (表示/非表示)を検出するための最良の解決策は、 ViewTreeObserverを使用することです。私はあなたが知らないならそれについて知るためにそう答えを直接指し示しています。ここにリンクがあります。
softkeyboardstate
使用したWindow.setSoftInputMode
メソッドを設定します。
そしてユーザーインタラクションを知るために私はonUserInteraction
メソッドをオーバーライドします
2つの旗を保持しました。1つのフラグは保存keyboardstate
することであり、別のフラグはアプリケーションがバックグラウンドに移行したかどうかを知ることです。
コード:
1.宣言された変数
int lastDiff = 0;
volatile boolean flag = false;
volatile int flag2 = 0;
2.2。ViewTreeObserver
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
activityRootView.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRootView.getRootView()
.getHeight() - (r.bottom - r.top);
if (lastDiff == heightDiff)
return;
lastDiff = heightDiff;
Log.i("aerfin","arefin "+lastDiff);
if (heightDiff > 100) { // if more than 100 pixels, its
// probably a keyboard...
flag2 = 0;
} else {
if (flag == false)
flag2 = 1;
}
}
});
3.ユーザーインタラクションの処理
@Override
public void onUserInteraction() {
super.onUserInteraction();
flag = true;
}
4.最後にonPause
そしてonResume
@Override
protected void onPause() {
super.onPause();
flag = true;
}
@Override
protected void onResume() {
flag = false;
switch (flag2) {
case 0:
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
break;
case 1:
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
break;
default:
break;
}
super.onResume();
}
説明:
ここでは、2つのフラグ(flag2
およびflag
)を使用しました。flag2
を保持し、アプリケーションがバックグラウンドに移行するか、ユーザーの操作があるかどうかkeyboardstate
を保持します。アプリケーションがバックグラウンドに移行すると、最初はキーボードが非表示になるため、が使用されます。他のことは上記のコードから簡単に理解できます。flag
flag
テスト:
s2(ics)、desire s(ics)、galaxy y(2.3.6)でテスト済み
最終コメント:
私はコードをすばやく書いたので、他の最適化を見逃す可能性があります。また、例外的なケースの可能性もあります。キーボード以外の理由で画面が変化した場合、キーボードの状態を検出できない可能性があります。