J'ai créé mon propre WebView et défini les objets WebChromeClient et WebViewClient. Lorsque je démarre cette WebView, les champs du formulaire HTML réagissent lorsque je les touche (un curseur apparaît), mais ils ne sont pas sélectionnés et le clavier virtuel ne démarre pas. Si j'utilise le trackball pour choisir le formulaire et que j'appuie dessus, le clavier apparaît.
J'ai essayé d'appeler myWebview.requestFocusFromTouch()
comme cette réponse suggérée, mais elle retourne false et n'aide pas.
http://code.google.com/p/Android/issues/detail?id=7189
Voici un correctif au cas où d'autres n'étaient pas clairs.
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;
}
});
D'accord 10% avec la réponse de Dv_MH. Cependant, la classe ci-jointe était un peu excessive. Tout ce que je devais faire était d'étendre WebView et de renvoyer true pour 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;
}
}
À partir de là, j'ai pu l'utiliser comme une WebView normale (même dans les boîtes de dialogue).
Alternativement, avec moins de code:
WebView web = new WebView(context) {
@Override
public boolean onCheckIsTextEditor() {
return true;
}
};
[~ # ~] important [~ # ~] J'ai passé des heures à chercher cela et je l'ai résolu en m'assurant que la disposition parent qui étend "ViewGroup" n'a pas de propriété
Android: descendantFocusability = "blocksDescendants" qui empêchent la mise en page enfant de se concentrer
OU Ajouter Android: focusable = "true" à la vue Web
La réponse d'AndroidChen n'a pas fonctionné pour moi du tout, mais j'ai recherché le lien fourni ( http://code.google.com/p/Android/issues/detail?id=7189 ) et j'ai trouvé le classe suivante, cela fonctionne parfaitement (Android Froyo sur HTC Bravo), pas seulement du texte, mais aussi tous les boutons, redirections, etc., tout fonctionne parfaitement: 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;
}
}
puis pour créer une vue web dans une boîte de dialogue, j'ai écrit ce code
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();
Ajoutez simplement EditText invisible sous 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"/>
Toutes ces solutions liées à la mise au point ne fonctionnaient pas sur mon Samsung Note 3/Android 5.0