2011-04-14 8 views
14

का उपयोग कर एचटीएमएल फ़ील्ड फोकस सेट करना मेरे पास केवल WebView घटक के साथ एक एप्लीकेशन है जिसका उपयोग कुछ गतिशील रूप से जेनरेट किए गए HTML को प्रदर्शित करने के लिए किया जाता है (जावास्क्रिप्ट भी चला सकता है)। यह WebView के लिए सक्षम है।एंड्रॉइड वेबव्यू - जावास्क्रिप्ट

कुछ पन्नों मैं के बाद पृष्ठ लोड समाप्त हो गया है इनपुट पाठ बक्से में से एक का ध्यान केंद्रित स्थापित करने के लिए कोशिश कर रहा हूँ के लिए - के माध्यम से नहीं शरीर onLoad(), लेकिन बजाय एक जे एस कॉल के बाद पेज समाप्त हो गया है में लोड हो रहा है यानी द्वारा onPageFinished()। जावास्क्रिप्ट के अधिकांश ठीक

webview.loadURL("javascript:JSMethod();"); 

निष्पादित करता लेकिन जब मैं एक ही कॉल का उपयोग करने के लिए एक document.getElementById('text1').focus() - कर्सर तत्व तक पहुँचने है, लेकिन Soft Keyboard पॉप नहीं होंगे। पृष्ठ पर किसी बटन से निष्पादित होने पर वही जावास्क्रिप्ट कोड वांछित प्रभाव होता है। टेक्स्ट 1 पर कर्सर रखें और Softkeyboard पॉप अप होता है -

मैं स्रोत कोड जो 3 बटन

  1. Focus Text1 है संलग्न कर रहा हूँ।
  2. Java Focus Text1 - एक ही जेएस निष्पादित करने के लिए जावा को कॉल करता है। केवल कर्सर को दिखाता है और कीबोर्ड
  3. Java Focus Text1 And Keyboard Open - जावा और फोर्स कीबोर्ड से जेएस को कॉल करता है।

मेरी समझ यह है कि जेएस निष्पादन को एक बटन/घटना का उपयोग करके ब्राउज़र से निष्पादित किया जाना चाहिए या जावा से WebView.loadURL() के माध्यम से भेजा गया है।

यहाँ मेरी प्रश्नों

  1. मैं जब Button#2 का उपयोग कर कुछ कमी कर रहा हूँ है? इस प्रकार मेरा वर्तमान कोड है और मैं केवल कर्सर सेट करता हूं लेकिन सॉफ़्टकेबोर्ड नहीं खुलता है।
  2. जब मैं Button#3 में लिखा गया तर्क का उपयोग करता हूं, तो मुझे कुछ बार क्षेत्र में कर्सर दिखाई नहीं देता है, लेकिन मुझे वांछित प्रभाव देता है और जब मैं पॉप अप कीबोर्ड में कुछ टाइप करता हूं तो कर्सर दिखाई देता है।
  3. क्या मैं Button#2 में देख सकता हूं कि व्यवहार एंड्रॉइड जेएस निष्पादन में एक बग हो सकता है? या हो सकता है कि WebView पर ध्यान केंद्रित न हो, यही कारण है कि केवल कर्सर प्रदर्शित होता है? मैंने webview.requestFocus() भी कोशिश की - मैं requestFocusOnTouch() नहीं लिख सकता क्योंकि यह मेरे पास एकमात्र दृश्य है और मुझे उम्मीद है कि यह स्वचालित रूप से केंद्रित है।

जावा कोड जो व्यवहार क़ौम

import android.app.Activity; 
    import android.content.Context; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.inputmethod.InputMethodManager; 
    import android.webkit.JsResult; 
    import android.webkit.WebChromeClient; 
    import android.webkit.WebView; 
    import android.webkit.WebViewClient; 

    public class WebViewProjectTestJSHTMLFocusActivity extends Activity { 

     Activity _current = null; 
     WebView wv = null; 

     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      _current = this; 
      //setContentView(R.layout.main); 
      String data = "<html><body>" + 
           "<script>function focusser() { document.getElementById(\"text1\").focus(); } </script>" + 
           "<script>function javaFocusser() { javautil.javaFocus(false); } </script>" + 
           "<script>function javaFocusserKeyboard() { javautil.javaFocus(true); } </script>" + 
           "Text 1<input type='text' id='text1'/><br/>" + 
           "Text 2<input type='text' id='text2'/><br/>" + 
           "<input type='button' value='Focus Text1' onClick='focusser()'/>" + 
           "<input type='button' value='Java Focus Text1' onClick='javaFocusser()'/>" + 
           "<input type='button' value='Java Focus Text1 And Keyboard Open' onClick='javaFocusserKeyboard()'/>" + 
          "</body></html>"; 
      wv = new WebView(this); 
      wv.getSettings().setJavaScriptEnabled(true); 

      // Set some HTML 
      wv.loadDataWithBaseURL("file:///android_asset/", data, "text/html", "UTF-8", null); 

      // Call back required after page load finished 
      wv.setWebViewClient(new CustomWebViewClient()); 

      // Enable Alert calls 
      wv.setWebChromeClient(new CustomWebChromeClient()); 

      // For JS->Java calls 
      wv.addJavascriptInterface(this, "javautil"); 

      setContentView(wv); 
     } 


     /** 
     * Calls the same javascript and forces the keyboard to open 
     */ 
     public void javaFocus(final boolean shouldForceOpenKeyboard) { 

      Thread t = new Thread("Java focusser thread") { 
       public void run() { 
        wv.loadUrl("javascript:focusser();"); 
        if(shouldForceOpenKeyboard) { 
         InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
         mgr.showSoftInput(wv, InputMethodManager.SHOW_IMPLICIT); 
        } 
       } 
      }; 

      // Run on the View Thread. 
      _current.runOnUiThread(t); 
     } 

     /** 
     * Calls focus method after the page load is complete. 
     */ 
     final class CustomWebViewClient 
     extends WebViewClient { 
      @Override 
      public void onPageFinished(WebView view, String url) { 
       // javaFocus(true); 
       Log.d("TestExamples", "focusser call complete"); 
      } 
     } 

     final class CustomWebChromeClient 
     extends WebChromeClient { 
      @Override 
      public boolean onJsAlert(WebView view, String url, String message, JsResult result) { 
       Log.d("TestExamples", "JS Alert :: " + message); 
       return false; 
      } 
     } 
    } 

समाधान अद्यतन 24-06-2011 यह काम करने के लिए, तुम सिर्फ वास्तविक जे एस फोकस कॉल करने से पहले wv.requestFocus(View.FOCUS_DOWN) उपयोग करने की आवश्यकता है। मैंने नीचे दिए गए सही संस्करण में javaFocus() विधि को संशोधित किया है। इससे पहले जब मैंने उल्लेख किया कि मैं requestFocus() का उपयोग कर रहा था, तो मैं उस समय उपयोग कर रहा था जब WebView विधि onCreate() विधि में प्रारंभ किया गया था। प्राथमिक अंतर अब हम WebView को जावास्क्रिप्ट document.getElementById("text1").focus(); निष्पादित करने से ठीक पहले हर बार फोकस करने के लिए मजबूर कर रहे हैं।

public void javaFocus(final boolean shouldForceOpenKeyboard) { 
    Thread t = new Thread("Java focusser thread") { 
     public void run() { 
      wv.requestFocus(View.FOCUS_DOWN); 
      wv.loadUrl("javascript:focusser();"); 
      if(shouldForceOpenKeyboard) { 
       InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
       mgr.showSoftInput(wv, InputMethodManager.SHOW_IMPLICIT); 
      } 
     } 
    }; 

    // Run on the View Thread. 
    _current.runOnUiThread(t); 
} 

भी सुनिश्चित करना है कि इस मुद्दे को स्पर्श आदि के माध्यम से शुरू हो रहा है, मैं WebView के 5 सेकंड प्रदर्शित बाद javaFocus() आरंभ करने के लिए एक पृष्ठभूमि के धागे का उपयोग कर रहा फोकस की वजह से तय नहीं किया गया था। संशोधित onCreate() नीचे है।

..... More onCreate code before.... 
// Enable Alert calls 
wv.setWebChromeClient(new CustomWebChromeClient()); 

// For JS->Java calls 
wv.addJavascriptInterface(this, "javautil"); 

setContentView(wv); 

new Thread("After sometime Focus") { 
    public void run() { 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     javaFocus(true); 
    } 
}.start(); 
.... onCreate() ends after this.... 
+0

पूरी तरह से स्पष्टीकरण के लिए धन्यवाद। मुझे एक ही समस्या थी लेकिन यह समाधान एंड्रॉइड 3.2 पर मेरे लिए काम नहीं करता था। अंत में मुझे एक ऐसा फ़ंक्शन लिखना पड़ा जो फ़ील्ड पर एक वास्तविक टैप अनुकरण करता था। मुझे नहीं पता कि आपका समाधान क्यों काम नहीं करता है। WebView सिर्फ quirks से भरा चॉक है। – Pre101

+0

मैंने एंड्रॉइड 3.x/4.x में इस कोड का परीक्षण नहीं किया। लेकिन क्या आपने इनमें से किसी एक में इस नमूना कार्यक्रम को चलाने की कोशिश की? – Swaroop

+0

मुझे यह जानना अच्छा लगेगा कि आप इस दृष्टिकोण का उपयोग यह सुनिश्चित करने के लिए कर सकते हैं कि एक प्रकार = संख्या इनपुट वास्तव में एक संख्यात्मक कीबोर्ड प्राप्त करता है। जहां तक ​​मुझे मिल रहा है, InputMethodManager केवल मानक कीबोर्ड लेआउट (क्वर्टी) खोल सकता है क्योंकि यह नहीं जानता कि वर्तमान में कौन सा HTML तत्व फोकस कर रहा है। Wv.requestFocus का उपयोग करने में मदद नहीं की। – Wytze

उत्तर

5

यह हो सकता है कि वेबदृश्य में एप्लिकेशन फोकस न हो। निष्पादन का प्रयास करें;

wv.requestFocus(View.FOCUS_DOWN); 
+2

यह वास्तव में काम किया। यह चाल 'wv.requestFocus (View.FOCUS_DOWN) का उपयोग करना है,' फोकस के लिए अनुरोध करने से ठीक पहले। प्रश्न को संशोधित करना ताकि कोड अच्छी तरह से स्वरूपित हो। – Swaroop

+0

मदद करने के लिए खुश! :) – Jivings

+0

किसी को भी खुराक पता है wv.requestFocus (View.FOCUS_DOWN) आईओएस पर काम करते हैं? धन्यवाद – star

संबंधित मुद्दे