2010-11-27 20 views
10

Estoy peleando con la administración de foco de WebView: WebView tiene problemas con la administración de foco de los componentes clásicos. ¡Aquí hay una aplicación simple con solo EditBox y WebView que carga Google!Problema de enfoque de Android 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> 

Y aquí es el código de 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/"); 
    } 
} 

En base a este ejemplo muy simple, es imposible obtener el foco en la vista Web (es decir, el cuadro de introducción de términos de búsqueda Google)! Sin embargo, al agregar "mContent.requestFocus();" durante la inicialización, las cosas mejoran. Puedo cambiar mi EditText a mi WebView si solo hago clic en WebView primero ... Pero el comportamiento pronto se vuelve muy "errático", con WebView que a veces no se enfoca al tocarlo, a veces lo consigue pero se queda con un rectángulo de enfoque alrededor de los campos de WebView (naranja o verde dependiendo de su teléfono) después de otro toque para volver al componente EditText (en el que puedo escribir texto).

De todos modos, una solución que he encontrado es añadir un touchListener y solicitud de enfoque cuando se hace clic en un 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; 
      } 
    }); 

Esto resuelve casi todos los problemas (el cambio de componentes clásicos a WebView y el texto escrito), excepto una: WebView mantiene el rectángulo de enfoque (verde o naranja) alrededor de los campos si tiene foco o no. En la captura de pantalla siguiente, mi EditText tiene el foco y recibe texto, pero WebView todavía parece que tiene foco. Probé clearFocus pero eso no hace nada:

See the result

Cualquier idea de cómo resolver esto? ¡Muchas gracias por su ayuda!

+0

ver mi respuesta aquí: https://stackoverflow.com/questions/3981716/ cant-click-on-listview-which-rows-are-made-of-webviews/48652004 # 48652004 Solo haga uso del evento onTouch –

Respuesta

2

Sólo tiene que añadir androide: enfocable = "true" a su disposición WebView:

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

Gracias, pero no funciona para mí –

5

Esto ayudó a mi problema de enfoque:

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

y esto sensible al tacto para:

Webview.getSettings().setLightTouchEnabled(true);

+1

simplemente agregando 'webView.requestFocus(); 'funcionó para mí. – Paul

+4

Gracias, pero no funciona para mí –

5

asegúrese de que la disposición de los padres que se extiende "ViewGroup" no tiene la propiedad

android:descendantFocusability = "blocksDescendants" que impiden la disposición niño para que no se centró

+0

Quiero hacer lo opuesto, no quería centrarme en el contenido, por lo que funcionó para mí: P gracias –