2011-05-19 5 views
13

से ग्रंथों का चयन कैसे करें मैं उपयोगकर्ता को वेबव्यू से कुछ ग्रंथों का चयन करने की अनुमति देना चाहता हूं और इसे एक टेक्स्ट संदेश के रूप में भेजने की आवश्यकता है। कृपया पाठ का चयन करने और क्लिपबोर्ड पर प्रतिलिपि बनाने और क्लिपबोर्ड से निकालने का तरीका ढूंढें। मैं कई उदाहरण देखा था, लेकिन कुछ भी नहीं है मुझे सच में मदद की ... TIAएंड्रॉइड: वेबव्यू

संपादित
से लिंक पर प्रदान किए @ orangmoney52 कोड का उपयोग कर। निम्नलिखित परिवर्तनों के साथ

getmethod का दूसरा पैरामीटर और विधि दूसरे पैरामीटर का आह्वान करें। अगर मैं शून्य देता हूं तो चेतावनी आ जाएगी .. कौन सा सही है?

public void selectAndCopyText() { 
    try { 
     Method m = WebView.class.getMethod("emulateShiftHeld", Boolean.TYPE); 
      m.invoke(BookView.mWebView, false); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      // fallback 
      KeyEvent shiftPressEvent = new KeyEvent(0,0, 
       KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_SHIFT_LEFT,0,0); 
      shiftPressEvent.dispatch(this); 
     } 

} 

इस त्रुटि हो रही है:

05-26 16:41:01.121: WARN/System.err(1096): java.lang.NoSuchMethodException: emulateShiftHeld 
+0

कृपया पूरा टुकड़ा –

उत्तर

14

ऊपर जवाब पूरी तरह से ठीक लग रहा है और यह जबकि पाठ का चयन आप कुछ भूल रहे हैं लगता है। इसलिए आपको कोड को दोबारा जांचना होगा और वेबव्यू के टचवेन्ट पर अपना ओवरराइड ढूंढना होगा।

मैं कोड यह ठीक काम करता है नीचे की कोशिश की ...

समारोह है विधि से ऊपर

private void emulateShiftHeld(WebView view) 
    { 
     try 
     { 
      KeyEvent shiftPressEvent = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, 
                KeyEvent.KEYCODE_SHIFT_LEFT, 0, 0); 
      shiftPressEvent.dispatch(view); 
      Toast.makeText(this, "select_text_now", Toast.LENGTH_SHORT).show(); 
     } 
     catch (Exception e) 
     { 
      Log.e("dd", "Exception in emulateShiftHeld()", e); 
     } 
    } 

कॉल भी आप चाहते हैं (आप एक बटन रखने और उसके क्लिक करें घटना में इस विधि कॉल कर सकते हैं): emulateShiftHeld (mWebView);

+1

एंड्रॉइड 4+ पर काम नहीं करता है। http://stackoverflow.com/questions/21101181/android-webview-how-to-correctly-copy-selected-text –

+10

मुझे यह भी समझ में नहीं आता कि यह उत्तर क्या कहने का प्रयास कर रहा है। – Michael

+0

कृपया यहां संपूर्ण स्निपेट जोड़ें ताकि नौसिखिया आसानी से इसका उपयोग कर सके –

0

@vnshetty, @ orangmoney52 से लिंक पर प्रदान कोड का उपयोग कर, मैं कुछ महीने पहले इस समस्या को पूरा करने में सक्षम था। आप अपने मेनू में एक बटन बना सकते हैं जो आपको टेक्स्ट कॉपी करने की अनुमति देता है। फिर, onOptionsItemSelected में, तो आप इस तरह के एक खंड हो सकता है:

case R.id.select_and_copy: { 
     Toast.makeText(getApplicationContext(), "Select Text", Toast.LENGTH_SHORT).show(); 
     selectAndCopyText(); 
     return true; 
    } 
+0

हाँ जोड़ने टोस्ट के बाद मैं दबाया shift कुंजी प्रदर्शित किया जाता है और चयन किया जाता है माउस लेकिन कुछ भी का उपयोग कर वेबव्यू सामग्री का चयन करने का प्रयास करें? क्या मुझे कुछ याद आ रही है? – vnshetty

+0

शिफ्ट कुंजी दबाए जाने की कोई आवश्यकता नहीं है। टोस्ट संदेश प्रदर्शित होने के बाद बस टेक्स्ट का चयन करें। – Phil

5

सबसे आसान तरीका है, हालांकि क्या प्रति निर्माता कार्यान्वित कॉपी/पेस्ट सुविधा के लिए एक की तरह लगता है के रूप में के रूप में सुंदर नहीं है, निम्नलिखित:

https://bugzilla.wikimedia.org/show_bug.cgi?id=31484

मूल रूप से, आप अपने के माध्यम से webview.setWebChromeClient(...) खुद WebChromeClient सेट कर रहे हैं फिर पाठ चयन डिफ़ॉल्ट रूप से अक्षम किया जाता है। यह आपके WebChromeClient जरूरतों कार्यान्वित पद्धति का अनुसरण करने के लिए सक्षम करने के लिए:

//@Override 
/** 
* Tell the client that the selection has been initiated. 
*/ 
public void onSelectionStart(WebView view) { 
    // Parent class aborts the selection, which seems like a terrible default. 
    //Log.i("DroidGap", "onSelectionStart called"); 
} 
+0

मेरे मामले में यह काम नहीं कर रहा है। मैं टच() पर ओवरराइड कर रहा हूं लेकिन यह झूठी लौट रहा है। वास्तविक समस्या क्या थी, क्या आपने स्पर्श घटनाओं को ओवरराइड किया था? – DroidBot

+0

मेरा सुझाव टच() पर ओवरराइड नहीं करना था। क्या आप अपनी खुद की, कस्टम, WebChromeClient सेटिंग्स हैं? –

+0

अरे यह वास्तव में काम करता है! – Bruce

6

कदम: 1 कस्टम WebView वर्ग बनाएँ। यह कक्षा वेबव्यू टेक्स्ट पर लंबे समय तक प्रेस पर मूल क्रिया पट्टी को ओवरराइड कर देगी। इसके अलावा यह एंड्रॉइड के विभिन्न संस्करण (4.0 पर परीक्षण) के लिए चयन केस को संभालता है यह कोड जावास्क्रिप्ट का उपयोग करके चयनित टेक्स्ट लेता है।

public class CustomWebView extends WebView { 
private Context context; 
// override all other constructor to avoid crash 
public CustomWebView(Context context) { 
    super(context); 
    this.context = context; 
    WebSettings webviewSettings = getSettings(); 
    webviewSettings.setJavaScriptEnabled(true); 
    // add JavaScript interface for copy 
    addJavascriptInterface(new WebAppInterface(context), "JSInterface"); 
} 

// setting custom action bar 
private ActionMode mActionMode; 
private ActionMode.Callback mSelectActionModeCallback; 
private GestureDetector mDetector; 

// this will over ride the default action bar on long press 
@Override 
public ActionMode startActionMode(Callback callback) { 
    ViewParent parent = getParent(); 
    if (parent == null) { 
     return null; 
    } 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { 
     String name = callback.getClass().toString(); 
     if (name.contains("SelectActionModeCallback")) { 
      mSelectActionModeCallback = callback; 
      mDetector = new GestureDetector(context, 
        new CustomGestureListener()); 
     } 
    } 
    CustomActionModeCallback mActionModeCallback = new CustomActionModeCallback(); 
    return parent.startActionModeForChild(this, mActionModeCallback); 
} 

private class CustomActionModeCallback implements ActionMode.Callback { 

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
     mActionMode = mode; 
     MenuInflater inflater = mode.getMenuInflater(); 
     inflater.inflate(R.menu.menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
     return false; 
    } 

    @Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 

     switch (item.getItemId()) { 
     case R.id.copy: 
      getSelectedData(); 
      mode.finish(); 
      return true; 
     case R.id.share: 
      mode.finish(); 
      return true; 
     default: 
      mode.finish(); 
      return false; 
     } 
    } 
    @Override 
    public void onDestroyActionMode(ActionMode mode) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      clearFocus(); 
     }else{ 
      if (mSelectActionModeCallback != null) { 
       mSelectActionModeCallback.onDestroyActionMode(mode); 
      } 
      mActionMode = null; 
     } 
    } 
} 
private void getSelectedData(){ 

    String js= "(function getSelectedText() {"+ 
      "var txt;"+ 
      "if (window.getSelection) {"+ 
       "txt = window.getSelection().toString();"+ 
      "} else if (window.document.getSelection) {"+ 
       "txt = window.document.getSelection().toString();"+ 
      "} else if (window.document.selection) {"+ 
       "txt = window.document.selection.createRange().text;"+ 
      "}"+ 
      "JSInterface.getText(txt);"+ 
      "})()"; 
    // calling the js function 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     evaluateJavascript("javascript:"+js, null); 
    }else{ 
     loadUrl("javascript:"+js); 
    } 
} 

private class CustomGestureListener extends GestureDetector.SimpleOnGestureListener { 
    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     if (mActionMode != null) { 
      mActionMode.finish(); 
      return true; 
     } 
     return false; 
    } 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    // Send the event to our gesture detector 
    // If it is implemented, there will be a return value 
    if(mDetector !=null) 
     mDetector.onTouchEvent(event); 
    // If the detected gesture is unimplemented, send it to the superclass 
    return super.onTouchEvent(event); 
} 

}

चरण 2: WebView इंटरफ़ेस के लिए अलग वर्ग पैदा करते हैं। घटना के लिए इस वर्ग listnes जावास्क्रिप्ट एक बार से कोड निष्पादित हो रही है

public class WebAppInterface { 
Context mContext; 

WebAppInterface(Context c) { 
    mContext = c; 
} 

@JavascriptInterface 
public void getText(String text) { 
    // put selected text into clipdata 
    ClipboardManager clipboard = (ClipboardManager) 
      mContext.getSystemService(Context.CLIPBOARD_SERVICE); 
    ClipData clip = ClipData.newPlainText("simple text",text); 
    clipboard.setPrimaryClip(clip); 
    // gives the toast for selected text 
    Toast.makeText(mContext, text, Toast.LENGTH_SHORT).show(); 
} 
} 

चरण 3: मेनू जोड़ें। तुम लोगों के लिए धन्यवाद: रेस में कस्टम मेनू के लिए एक्सएमएल> मेनू फ़ोल्डर

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
<item 
    android:id="@+id/copy" 
    android:icon="@drawable/ic_action_copy" 
    android:showAsAction="always" 
    android:title="copy"> 
</item> 
<item 
    android:id="@+id/share" 
    android:icon="@drawable/ic_action_share" 
    android:showAsAction="always" 
    android:title="share"> 
</item> 

मैं नीचे सूचीबद्ध इस लक्ष्य को हासिल करने के लिए कई लिंक की मदद ली।

कैसे संस्करण 4.0 के लिए डिफ़ॉल्ट कार्रवाई बार How to override default text selection of android webview os 4.1+?

अधिभावी के लिए जावास्क्रिप्ट Why can't I inject this javascript in the webview on android?

इंजेक्शन लगाने के लिए वेबव्यू http://developer.android.com/guide/webapps/webview.html#UsingJavaScript

पर जावास्क्रिप्ट का उपयोग करने के। 4.3 पाठ चयन करने के लिए Webview text selection not clearing

+0

के साथ शुरू होने वाला एक नया वेबव्यू वेबव्यू के लंबे प्रेस पर चयन को सक्षम करने के लिए कैसे है? कृपया इसके लिए मेरी मदद करें :) –