Проблема фокуса Android WebView - PullRequest
11 голосов
/ 28 ноября 2010

Я борюсь с управлением фокусом в WebView: WebView смешивается с управлением фокусом классических компонентов. Вот простое приложение, содержащее только EditBox и WebView, которое загружает Google!

<?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 ();" во время инициализации все становится лучше. Я могу переключиться с моего EditText на мой WebView, если сначала нажму только на 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; 
            }
    });

Это решает почти все проблемы (переключение с классических компонентов на WebView и написание текста), за исключением одной: WebView сохраняет focusRectangle (зеленый или оранжевый) вокруг полей независимо от того, имеет он фокус или нет. На скриншоте ниже мой EditText имеет фокус и получает текст, но WebView по-прежнему выглядит так, как будто имеет фокус. Я пробовал clearFocus, но это ничего не делает:

См. Результат

Есть идеи, как это решить? Большое спасибо за вашу помощь!

Ответы [ 3 ]

7 голосов
/ 07 марта 2014

убедитесь, что родительский макет, который расширяет "ViewGroup", не имеет свойства

android:descendantFocusability = "blocksDescendants", которые предотвращают фокусировку дочернего макета

5 голосов
/ 17 февраля 2012

Это помогло моей проблеме с фокусом:

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

и это для чувствительного прикосновения:

Webview.getSettings().setLightTouchEnabled(true);

2 голосов
/ 17 марта 2011

Просто добавьте android: focusable = "true" в макет WebView:

<WebView android:id="@+id/uiContent"
    android:layout_weight="1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:focusable="true"/>
...