Teclado suave de Android no abierto en webView`
Estoy usando WebView en AlertDialog para autenticar al usuario a twitter. Pero cuando hago clic en el campo en webview, el teclado android no abre. Aquí está mi código que muestra cómo he añadido webview en el diálogo de alerta. I implícitamente llamar al teclado de Android, pero abre el teclado detrás del diálogo de alerta.
Aquí está mi código.
- ¿Cómo importar el código fuente del proyecto de Android App en Eclipse?
- (Java / Android) Calcular días entre 2 fechas y presentar el resultado en un formato específico
- El evento de clic de botón de Android AppWidget no se recibe después de que el lanzador de inicio de fuerza detiene
- Android: Dibujo de un botón como spinner
- ¿Cómo actualizar vista de un widget en el botón de clic en android?
public static void webViewDialog(final String authorizationURL, final int type) { final boolean correctPin; System.out.println("In webViewDialog"); container = new LinearLayout(context); container.setOrientation(LinearLayout.VERTICAL); container.setMinimumWidth(200); container.setMinimumHeight(320); webView = new WebView(context); webView.setMinimumWidth(200); webView.requestFocusFromTouch(); webView.setMinimumHeight(380); webView.getSettings().setJavaScriptEnabled(true); webView.setWebViewClient(new TwitterWebViewClient()); webView.loadUrl(authorizationURL); webView.setBackgroundColor(0xFFbbd7e9); container.addView(webView); Builder webDialog = new AlertDialog.Builder(context); webDialog.setView(container).setTitle("Twitter Login") .setPositiveButton("Ok", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (type == 0) { twitterPinCodeDialog(); dialog.dismiss(); } } }).show(); showVirtualKeyboard(); } public static void showVirtualKeyboard() { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { InputMethodManager m = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); if(m != null) { // m.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); m.toggleSoftInput(0, InputMethodManager.SHOW_IMPLICIT); } } }, 100); }
- Android: errorMessageBackground no obtener ningún recurso encontrado error en styles.xml
- Resaltar para el elemento seleccionado en la lista expandible
- Android HelloViews Spinner Tutorial R.id y R.array no se pueden resolver
- Cómo obtener el ancho y la altura de la pantalla
- Uso de ViewPager caches Fragmentos después de la rotación de la pantalla?
- ¿Cómo detener el desplazamiento en un Widget de Galería?
- Android: Actualizar el widget en la disponibilidad de la conexión de red
- ¿La elevación no funciona dentro de los widgets de la pantalla de inicio de Android?
Aquí está mi solución a este problema:
Poner un texto de edición de maniquí, y establecer su visibilidad a GONE
, y añadirlo a un LinearLayout que contiene, después de agregar el WebView al diseño.
Ejemplo:
AlertDialog.Builder builder = new AlertDialog.Builder(this); LinearLayout wrapper = new LinearLayout(this); WebView webView = new WebView(this); EditText keyboardHack = new EditText(this); keyboardHack.setVisibility(View.GONE); webView.loadUrl(url); wrapper.setOrientation(LinearLayout.VERTICAL); wrapper.addView(webView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); wrapper.addView(keyboardHack, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); builder.setView(wrapper); builder.create().show();
Una vez hecho esto, todo debería funcionar correctamente, y cuando se selecciona un elemento en el WebView, el teclado aparece como se esperaba.
Estoy utilizando un PopupWindow con un WebView dentro de él y experimentado el mismo problema, pero si fijo focusable a verdadero en el padre el problema desaparece:
popupWindow.setFocusable(true);
¡Espero que esto ayude!
También sufro de este problema, solucioné este problema personalizando el diálogo, aquí está mi código de diálogo de encargo, espero así que esto es uso completo para usted.
TwitterDialog fb=new TwitterDialog(this); fb.abc(); //fb.dismiss(); class TwitterDialog extends Dialog { Context context; String url="https://accounts.google.com/ServiceLogin?service=mail&passive=true&rm=false&continue=https://mail.google.com/mail/&ss=1&scc=1<mpl=default<mplcache=2"; public TwitterDialog(Context context) { super(context); this.context=context; } void abc(){ LinearLayout mContent = new LinearLayout(context); mContent.setOrientation(LinearLayout.VERTICAL); final float scale = context.getResources().getDisplayMetrics().density; float[] dimensions =new float[]{400.0f,500.0f}; addContentView(mContent, new FrameLayout.LayoutParams( (int) (dimensions[0] * scale + 0.5f), (int) (dimensions[1] * scale + 0.5f))); FrameLayout.LayoutParams FILL = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); WebView mWebView = new WebView(context); mWebView.setVerticalScrollBarEnabled(false); mWebView.setHorizontalScrollBarEnabled(false); mWebView.setWebViewClient(new WebClicent()); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.loadUrl(url); mWebView.setLayoutParams(FILL); mContent.addView(mWebView); TwitterDialog.this.show(); } class WebClicent extends WebViewClient{ @Override public void onLoadResource(WebView view, String url) { System.out.println("onLoadResource "+url); super.onLoadResource(view, url); } @Override public void onPageFinished(WebView view, String url) { System.out.println("onPageFinished "+url); //TwitterDialog.this.dismiss(); super.onPageFinished(view, url); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { System.out.println("onPageStarted "+url); super.onPageStarted(view, url, favicon); } } }//TWitterDialog
Tuve un problema similar y lo resolví de esta manera:
-
Anule el método onCreateView () en el fragmento de diálogo y defino toda la configuración de la vista de contenido para mi vista web.
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.webview, container, false); // do some config // some other stuffs loginpage.loadUrl(url); return view; }
-
En el método onCreateDialog () sólo añadir estos.
@Override public Dialog onCreateDialog(Bundle savedInstaceState) { Dialog dialog = super.onCreateDialog(savedInstaceState); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); return dialog; }
En mi caso quería mostrar un diálogo sin título. Así que debido a la DialogBuilder cuidar de la creación de la vista de diálogo he decidido anular el onCreateView () y acaba de llamar a la super.onCreateDialog () y agregar mi configuración de la ventana.
La razón por la que su teclado puede no aparecer, es probablemente porque está utilizando un dispositivo que ya tiene un teclado duro. CUALQUIER DISPOSITIVO CON UN TECLADO FÍSICO no necesita mostrar un teclado suave … Es por eso que no está mostrando. Porque el dispositivo o el emulador tiene un teclado físico duro.