2011-11-04 11 views
7

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

答えて

4

問題を解決するには、キーボードが常に表示された状態にし、操作が完了したときにユーザーにキーボードを閉じることがあります。

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

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

4

私はまったく同じボートにいるので、理想的な解決策を見つけたなら、それを聞いてみたいです。

編集: 成功!とにかく前よりずっと良い。私は古いソリューションを削除しました。これはこれが優れているからです。

https://stackoverflow.com/a/10536033/513038に記載されているように、loadData()はキーボードを非表示にします。 しかし、私はWebViewのhideSoftKeyboard()で、imm.isActive(mWebView)を介してWebViewがアクティブかどうかを確認するためにInputMethodManagerをチェックすることを発見しました。

したがって、loadData()の前にEditTextにフォーカスを切り替え、直後にWebViewに戻すと、キーボードがスティックされます。それは簡単に大文字に切り替える、私は、Webviewにフォーカスを返すと思う(実際には、これは常に起こるようではありませんが、それに依存します)しかし、それはキーボードが離れてちらつきよりも目立っています。

何が起こる必要があるの要旨は以下の通りです。

WebViewを拡張します。コンストラクタで

public EditText mFocusDistraction; 

を、次の行があります:それをのEditTextフィールドを与える

public void loadUrl(String s) { 
    mFocusDistraction.requestFocus(); 
    super.loadUrl(s); 
    this.requestFocus(); 
} 

それは基本的に、作業を取得する必要があります次にloadUrlを()をオーバーライド

mFocusDistraction = new EditText(context); 
addView(mFocusDistraction); 

を。これは、しかし、少しバギーですので、ここでより完全なクラスです:

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); 
     } 
    } 
} 
+2

これは、以前に選択した入力/テキストフィールドからフォーカスを失うという問題があります。 1)入力用の入力を選択します 2)loadUrlは と呼ばれます3)キーボードはまだ起動していますが、何も入力しません(同じ入力にもう入力しません) –

+0

@HaykSaakian Really?私は知らないよ;私が私のために働くものは、私はここに置くときに何か間違いを犯さなかった。 loadUrlを実行しているのと同じWebviewで入力しようとしていると思います。 – Erhannis

+0

多分それはちょうど小さな時間窓であり、あなたのケースでは気付かないでしょうか?私の場合、1秒間に何度もloadUrlを呼び出すページがあります(javacriptでloadUrlを使用してメッセージを挿入するJava Webソケットを使用するチャット・ページ) –

0

XamarinのAndroid(オルタナティブ):

InputMethodManager inputManager = (InputMethodManager)GetSystemService(Context.InputMethodService); 
inputManager.ToggleSoftInput (ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly); 
関連する問題