android - studio - Al tocar el campo de formulario en WebView no se muestra el teclado virtual
barra de desplazamiento en android (5)
De acuerdo 10% con la respuesta de Dv_MH. Sin embargo, la clase adjunta fue un poco excesiva. Todo lo que tenía que hacer era extender WebView y devolver verdadero para onCheckIsTextEditor ()
import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebView;
public class LiveWebView extends WebView {
public LiveWebView(Context context) {
super(context);
}
public LiveWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LiveWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onCheckIsTextEditor() {
return true;
}
}
A partir de ahí, pude usarlo como una WebView normal (incluso en Diálogos).
Alternativamente, con menos código:
WebView web = new WebView(context) {
@Override
public boolean onCheckIsTextEditor() {
return true;
}
};
Creé mi propia WebView y establecí los objetos WebChromeClient y WebViewClient. Cuando inicio este WebView, los campos de formulario HTML reaccionan cuando los toco (aparece un cursor), pero no se seleccionan ni se inicia el teclado virtual. Si uso la bola de seguimiento para elegir el formulario y lo presiono, el teclado aparece.
Traté de llamar a myWebview.requestFocusFromTouch()
como se sugirió esta respuesta , pero devuelve falso y no ayuda.
http://code.google.com/p/android/issues/detail?id=7189
Aquí hay una solución en caso de que otros no estén claros.
webview.requestFocus(View.FOCUS_DOWN);
webview.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;
}
});
La respuesta de AndroidChen no funcionó para mí, pero busqué en el enlace proporcionado ( http://code.google.com/p/android/issues/detail?id=7189 ) y encontré la siguiente clase, funciona perfectamente ( Android Froyo en HTC Bravo), no solo texto, sino también todos los botones, redirecciones, etc., todo funciona perfectamente: D
class LiveWebView extends WebView
{
Context mContext;
public LiveWebView(Context context, String URL)
{
super(context);
mContext = context;
setWebViewClient(URL);
}
@Override
public boolean onCheckIsTextEditor()
{
return true;
}
@SuppressLint("SetJavaScriptEnabled")
boolean setWebViewClient(String URL)
{
setScrollBarStyle(SCROLLBARS_INSIDE_OVERLAY);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus(View.FOCUS_DOWN);
WebSettings webSettings = getSettings();
webSettings.setSavePassword(false);
webSettings.setSaveFormData(false);
webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(false);
webSettings.setUseWideViewPort(false);
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;
}
});
this.setWebViewClient(new WebViewClient()
{
ProgressDialog dialog = new ProgressDialog(mContext);
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
loadUrl(url);
return true;
}
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
{
Toast.makeText(mContext, "Oh no! " + description, Toast.LENGTH_SHORT).show();
}
public void onPageStarted(WebView view, String url, Bitmap favicon)
{
if (dialog != null)
{
dialog.setMessage("Loading...");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
dialog.show();
}
}
public void onPageFinished(WebView view, String url)
{
if (dialog != null)
{
dialog.cancel();
}
}
});
this.setWebChromeClient(new WebChromeClient()
{
public void onProgressChanged(WebView view, int progress)
{
// Activities and WebViews measure progress with different scales.
// The progress meter will automatically disappear when we reach 100%
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result)
{
result.confirm();
return true;
}
});
loadUrl(URL);
return true;
}
}
y luego para crear una vista web dentro de un diálogo, escribí este código
AlertDialog.Builder alert = new AlertDialog.Builder(M_PaymentOptions.this);
alert.setNegativeButton("Back to Payment Options", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int id)
{}
});
alert.setTitle("BarclayCard Payment");
LiveWebView liveWevViewObject = new LiveWebView(M_PaymentOptions.this, redirecturl);
alert.setView(liveWevViewObject);
alert.show();
IMPORTANTE : pasé horas buscando esto y lo resolví asegurándome de que el diseño principal que extiende "ViewGroup" no tenga propiedad
android: descenddantFocusability = "blocksDescendants" que evita que el diseño infantil se concentre
O agregue Android: enfocable = "verdadero" a la vista web
Solo agrega EditText invisible en WebView
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible" />
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Todas estas soluciones relacionadas con el enfoque no funcionaron en mi Samsung Note 3 / Android 5.0