レイアウトに WebView といくつかのボタンがあります。WebView に大きなタグがあります。このアプリは、テキストファイルを編集するために使用されます。ボタンは、WebView 内のテキスト領域に影響を与えるために使用されます。ユーザーがボタン (テキストビューを移動するための矢印ボタンなど) を押すと、キーボードが閉じます。私は toggleSoftInput を使用しましたが、それはキーボードを表示するかどうかを切り替えるだけです。ボタンが押されたときにボタンがソフトキーボードを非表示にしないようにしたい。特定の問題については何も見つかりませんでした。私は何週間も探しました。ボタンが Android でソフト キーボードを非表示にしないようにする方法を知っている人はいますか?
3 に答える
問題の解決策は、キーボードを常に表示したままにし、アクションが完了したときにユーザーがキーボードを閉じることができるようにすることです。
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
アクティビティの onCreate() メソッドでこのコードを試してください。ユーザーがキーボードの閉じるボタンまたは戻るボタンを押した場合は、閉じる必要があることに注意してください。そして、そのシナリオに干渉するべきではないと思います。アクションが完了したら、コードからキーボードを閉じることができます。
私もまったく同じ状況なので、理想的な解決策を見つけたことがあれば、ぜひ聞かせてください。
編集:成功!とにかく、以前よりもはるかに優れています。この方が優れているため、古いソリューションを削除しました。
https://stackoverflow.com/a/10536033/513038に記載されているように、loadData() がキーボードを非表示にしていることがわかりました。 ただし、WebView の hideSoftKeyboard() で、InputMethodManager をチェックして、imm.isActive(mWebView) を介して WebView がアクティブかどうかを確認することがわかりました。
そのため、loadData() の前にフォーカスを EditText に切り替え、その直後に WebView に戻すと、キーボードが動かなくなります! 一時的に大文字に切り替わりますが、Web ビューにフォーカスを戻すと思います (実際には、これは常に起こるとは限りません。場合によって異なります) が、キーボードのちらつきよりもはるかに目立ちません。
何が起こる必要があるかの要点は次のとおりです。
WebView を拡張します。EditText フィールドを指定します。
public EditText mFocusDistraction;
コンストラクターには、次の行があります。
mFocusDistraction = new EditText(context);
addView(mFocusDistraction);
次に、loadUrl() をオーバーライドします。
public void loadUrl(String s) {
mFocusDistraction.requestFocus();
super.loadUrl(s);
this.requestFocus();
}
基本的に、それはそれを機能させるはずです。ただし、少しバグがあるため、より完全なクラスを次に示します。
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebView;
import android.widget.EditText;
public class WebViewMod extends WebView {
public EditText mFocusDistraction;
public Context mContext;
public WebViewMod(Context context) {
super(context);
init(context);
}
public WebViewMod(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public WebViewMod(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public WebViewMod(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) {
super(context, attrs, defStyle, privateBrowsing);
init(context);
}
public void init(Context context) {
// This lets the layout editor display the view.
if (isInEditMode()) return;
mContext = context;
mFocusDistraction = new EditText(context);
mFocusDistraction.setBackgroundResource(android.R.color.transparent);
this.addView(mFocusDistraction);
mFocusDistraction.getLayoutParams().width = 1;
mFocusDistraction.getLayoutParams().height = 1;
}
@Override
public void loadUrl(final String url) {
if (mContext instanceof Activity && this.isFocused()) {
((Activity)mContext).runOnUiThread(new Runnable() {
@Override
public void run() {
mFocusDistraction.requestFocus();
WebViewMod.super.loadUrl(url);
WebViewMod.this.requestFocus();
}
});
} else {
super.loadUrl(url);
}
}
}