web-dev-qa-db-ja.com

Android WebViewフォーカスの問題

私はWebViewのフォーカス管理と戦っています:WebViewは古典的なコンポーネントのフォーカス管理を台無しにします。これは、EditBoxとGoogleをロードするWebViewだけを備えた単純なアプリケーションです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:and="http://schemas.Android.com/apk/res/Android"
              xmlns:webtag="http://schemas.Android.com/apk/res/com.webtag"
              and:orientation="vertical" and:layout_width="fill_parent" and:layout_height="fill_parent">
    <LinearLayout and:id="@+id/HorizontalScrollView02"
                  and:layout_width="fill_parent" and:layout_height="wrap_content">
        <EditText and:id="@+id/EditText01"
                  and:layout_width="wrap_content" and:layout_height="wrap_content"
                  and:text="@+id/EditText01"/>
    </LinearLayout>
    <WebView and:id="@+id/uiContent"
             and:layout_weight="1"
             and:layout_width="fill_parent"
             and:layout_height="fill_parent"/>
</LinearLayout>

そしてここにJavaコード:

public class WebtagActivity extends Activity
{
    // UI components.
    private WebView mContent;
    private EditText mUrl;


    @Override
    public void onCreate (Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        mContent = (WebView) findViewById(R.id.uiContent);
        mContent.getSettings().setJavaScriptEnabled(true);
        mContent.loadUrl("http://www.google.fr/");
    }
}

この非常に単純な例に基づくと、WebView(つまり、Google検索用語の入力ボックス)に焦点を合わせるのは不可能です!ただし、「mContent.requestFocus();」を追加する場合初期化中、状況は良くなります。最初にWebViewをクリックするだけで、EditTextからWebViewに切り替えることができます...しかし、動作はすぐに非常に「不安定」になり、WebViewに触れたときにフォーカスが得られない場合があります。また、WebViewフィールドの周りにフォーカス長方形が表示されたままになる場合もあります。 (お使いの携帯電話に応じてオレンジまたは緑)もう一度タッチしてEditTextコンポーネント(テキストを書き込むことができます)に戻ります!

とにかく、私が見つけた解決策は、touchListenerを追加し、WebViewをクリックしたときにフォーカスを要求することです。

mContent.setOnTouchListener(new View.OnTouchListener() { 
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) { 
                   case MotionEvent.ACTION_DOWN: 
                   case MotionEvent.ACTION_UP: 
                       if (!v.hasFocus()) { 
                           v.requestFocus(); 
                       } 
                       break; 
               } 
               return false; 
            }
    });

これにより、1つを除くほとんどすべての問題(従来のコンポーネントからWebViewへの切り替えとテキストの書き込み)が解決されます。WebViewは、フォーカスがあるかどうかに関係なく、フィールドの周囲にfocusRectangle(緑またはオレンジ)を保持します。以下のスクリーンショットでは、EditTextにフォーカスがあり、テキストを受信して​​いますが、WebViewにはまだフォーカスがあるように見えます。 clearFocusを試しましたが、何もしません。

結果を見る

これを解決する方法はありますか?あなたの助けをどうもありがとう!

11
Ratamovic

WebViewレイアウトにAndroid:focusable = "true"を追加するだけです。

<WebView Android:id="@+id/uiContent"
    Android:layout_weight="1"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:focusable="true"/>
2
Johnny

ViewGroup」を拡張する親レイアウトにプロパティがないことを確認してください

Android:descendantFocusability = "blocksDescendants"子のレイアウトが集中するのを防ぐ

7
M_AWADI

これは私の焦点の問題を助けました:

Webview.requestFocus(View.FOCUS_DOWN|View.FOCUS_UP);

そしてこれは敏感なタッチのために:

Webview.getSettings().setLightTouchEnabled(true);

5
abhishek