9

レイアウトに WebView といくつかのボタンがあります。WebView に大きなタグがあります。このアプリは、テキストファイルを編集するために使用されます。ボタンは、WebView 内のテキスト領域に影響を与えるために使用されます。ユーザーがボタン (テキストビューを移動するための矢印ボタンなど) を押すと、キーボードが閉じます。私は toggleSoftInput を使用しましたが、それはキーボードを表示するかどうかを切り替えるだけです。ボタンが押されたときにボタンがソフトキーボードを非表示にしないようにしたい。特定の問題については何も見つかりませんでした。私は何週間も探しました。ボタンが Android でソフト キーボードを非表示にしないようにする方法を知っている人はいますか?

4

3 に答える 3

6

問題の解決策は、キーボードを常に表示したままにし、アクションが完了したときにユーザーがキーボードを閉じることができるようにすることです。

InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

アクティビティの onCreate() メソッドでこのコードを試してください。ユーザーがキーボードの閉じるボタンまたは戻るボタンを押した場合は、閉じる必要があることに注意してください。そして、そのシナリオに干渉するべきではないと思います。アクションが完了したら、コードからキーボードを閉じることができます。

于 2012-06-29T20:27:58.907 に答える
4

私もまったく同じ状況なので、理想的な解決策を見つけたことがあれば、ぜひ聞かせてください。

編集:成功!とにかく、以前よりもはるかに優れています。この方が優れているため、古いソリューションを削除しました。

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);
        }
    }
}
于 2013-09-12T23:52:49.973 に答える