2010-11-16 72 views
52

我創建了自己的WebView並設置了WebChromeClient和WebViewClient對象。當我啓動這個WebView時,當我觸摸它們(光標出現)時,HTML表單域會作出反應,但它們不會被選中,軟鍵盤也不會啓動。如果我使用軌跡球選擇窗體並按下它,鍵盤確實會出現。在WebView中點擊表單域並不顯示軟鍵盤

我試圖撥打myWebview.requestFocusFromTouch()作爲this answer建議,但它返回false並沒有幫助。

+0

你有沒有做到這一點? :http://stackoverflow.com/questions/35465569/changing-the-input-source-of-form-fields-in-webview – debonair 2016-02-17 21:49:46

回答

94

http://code.google.com/p/android/issues/detail?id=7189

這是在其他情況下,修復並不清楚。

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; 
     } 
    }); 
+0

Thx ...這種行爲似乎是一個錯誤,它是固定在ICS。 – Janusz 2011-12-20 13:03:26

+0

@androidchen非常感謝你...節省我的時間:) – 2013-01-19 10:10:30

+0

我得到了錯誤 - 它要我重命名「onTouch」...我該怎麼做?請幫助 – Levchik 2015-11-04 22:45:50

3

AndroidChen的答案沒有工作,爲我所有,但我搜索(http://code.google.com/p/android/issues/detail?id=7189)提供的鏈接,我發現下面的類,它完美的作品(Android的升級Froyo的HTC布拉沃),而不僅僅是文字,還所有的按鈕,重定向等,一切完美的作品: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; 
    } 
} 

,然後在對話中創建一個web視圖,我寫了這個代碼

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(); 
+0

謝謝,Dv_MH!接受的答案也不適用於我,但是這個工作。 – 2014-05-12 08:48:12

24

同意10%的Dv_MH的回答。但是,所附的課程有點過分。所有我需要做的是延長的WebView &爲onCheckIsTextEditor()返回true

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; 
    } 
} 

從那裏,我可以使用它作爲一個正常的WebView(甚至對話框)。

或者,用更少的代碼:

WebView web = new WebView(context) { 
    @Override 
    public boolean onCheckIsTextEditor() { 
    return true; 
    } 
}; 
+1

這是唯一真正爲我工作的人。其他一切都忽略了軟鍵盤。 – kingargyle 2014-08-06 15:10:33

+0

這對我來說(而不是第一次回答)'DialogFrament' – David 2014-10-12 13:59:54

+0

這也適用於我。我做了一點不同 – 2014-10-15 04:17:38

4

重要 我花了幾個小時尋找這一點,我通過確保解決它所有擴展「的ViewGroup」沒有財產

父佈局

android:descendantFocusability =「blocksDescendants」防止兒童佈局變得集中

添加機器人:可調焦= 「true」 將的WebView

+0

搜索我的項目「DescendantFocusability」刪除該行,它終於奏效。不是在一個webView中,我不知道如何結束在源代碼中的行。 – chaggy 2016-11-15 18:06:23

1

只需添加的WebView下看不見的EditText

<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"/> 

所有這些焦點相關的解決方案,並沒有對我的三星工作的注意事項3/Android 5.0

相關問題