2013-02-20 11 views
27

मैं इस तरह की घटनाओं को कैसे रोक सकता हूं?एंड्रॉइड इंटरसेप्ट पेस्ट copy cut संपादित पर टेक्स्ट

मैं कुछ तर्क है जब उपयोगकर्ता मेरी EditText में कुछ पाठ मुझे पता है मैं TextWatcher उपयोग कर सकते हैं चिपकाने का प्रयास कर लेकिन मेरे लिए यह entrypoint अच्छा नहीं, क्योंकि मैं केवल पेस्ट के मामले में अवरोधन करने की जरूरत है और नहीं हर बार उपयोगकर्ता को जोड़ना होगा प्रेस मेरी EditText,

+0

अच्छी चुनौती। मेरा जवाब देखो। –

उत्तर

62

लगता है वहाँ ज्यादा नहीं है आप API का उपयोग करके कर सकते हैं: android paste event

Source reading to the rescue!

मैं TextView (EditText के एंड्रॉयड स्रोत में खोदे गए एकहैकुछ अलग विन्यास के साथ) और पता चला कि कट/कॉपी/पेस्ट विकल्पों की पेशकश करने वाला मेनू सिर्फ एक संशोधित ContextMenu (source) है।

सामान्य संदर्भ-मेनू के लिए, दृश्य को मेनू (source) बनाना होगा और फिर कॉलबैक-विधि (source) में बातचीत को संभालना होगा।

क्योंकि हैंडलिंग विधि public है, हम EditText को विस्तारित करके और विभिन्न कार्यों पर प्रतिक्रिया करने के लिए विधि को ओवरराइट करके इसे आसानी से जोड़ सकते हैं।

import android.content.Context; 
import android.util.AttributeSet; 
import android.widget.EditText; 
import android.widget.Toast; 

/** 
* An EditText, which notifies when something was cut/copied/pasted inside it. 
* @author Lukas Knuth 
* @version 1.0 
*/ 
public class MonitoringEditText extends EditText { 

    private final Context context; 

    /* 
     Just the constructors to create a new EditText... 
    */ 
    public MonitoringEditText(Context context) { 
     super(context); 
     this.context = context; 
    } 

    public MonitoringEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.context = context; 
    } 

    public MonitoringEditText(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     this.context = context; 
    } 

    /** 
    * <p>This is where the "magic" happens.</p> 
    * <p>The menu used to cut/copy/paste is a normal ContextMenu, which allows us to 
    * overwrite the consuming method and react on the different events.</p> 
    * @see <a href="http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3_r1/android/widget/TextView.java#TextView.onTextContextMenuItem%28int%29">Original Implementation</a> 
    */ 
    @Override 
    public boolean onTextContextMenuItem(int id) { 
     // Do your thing: 
     boolean consumed = super.onTextContextMenuItem(id); 
     // React: 
     switch (id){ 
      case android.R.id.cut: 
       onTextCut(); 
       break; 
      case android.R.id.paste: 
       onTextPaste(); 
       break; 
      case android.R.id.copy: 
       onTextCopy(); 
     } 
     return consumed; 
    } 

    /** 
    * Text was cut from this EditText. 
    */ 
    public void onTextCut(){ 
     Toast.makeText(context, "Cut!", Toast.LENGTH_SHORT).show(); 
    } 

    /** 
    * Text was copied from this EditText. 
    */ 
    public void onTextCopy(){ 
     Toast.makeText(context, "Copy!", Toast.LENGTH_SHORT).show(); 
    } 

    /** 
    * Text was pasted into the EditText. 
    */ 
    public void onTextPaste(){ 
     Toast.makeText(context, "Paste!", Toast.LENGTH_SHORT).show(); 
    } 
} 

अब, जब उपयोगकर्ता कटौती/कॉपी/पेस्ट का उपयोग करता है, एक Toast दिखाया गया है (बेशक आप अन्य बातों के कर सकता है, भी): यहाँ एक उदाहरण-कार्यान्वयन है।

साफ बात यह है कि इस Android 1.5 करने के लिए नीचे काम करता है और आप संदर्भ मेनू फिर से बनाने (ऊपर लिंक प्रश्न में सुझाव दिया की तरह) है, जो की लगातार नज़र रखेंगे की जरूरत नहीं है मंच (उदाहरण के लिए एचटीसी सेंस के साथ)।

+0

मुझे मिला ** कक्षा को खाली कन्स्ट्रक्टर ** तत्काल नहीं कर सकता ** त्रुटि का क्या समाधान ??? –

+0

अच्छी तरह से, कक्षा में कोई खाली कन्स्ट्रक्टर नहीं है। आपको इसे 'संदर्भ' का एक उदाहरण पास करना होगा (यदि आपका कोड किसी गतिविधि में है, तो आप इसे 'यह' पास कर सकते हैं)। –

+0

श्रोता के साथ अपने समाधान का विस्तार किया ताकि इसे प्लग और प्ले घटक के रूप में उपयोग किया जा सके। गिस्ट https://gist.github.com/guillermomuntaner/82491cbf0c88dec560a5 – GuillermoMP

0

एक बहुत आसान तरीका है, हालांकि 100% विश्वसनीय नहीं है। अपने editbox को

जोड़ें TextChangedListener:

EditText et = (EditText) mView.findViewById(R.id.yourEditText); 
et.addTextChangedListener(new TextWatcher() { 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
    if (count > 2) toast("text was pasted"); 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

    } 

    public void afterTextChanged(Editable s) { 

    } 
}); 

अधिक से अधिक 2 पात्रों के लिए पाठ परिवर्तन, आप मान सकते हैं यदि यह चिपकाया गया था (कुछ स्माइली दो अक्षर का समय लग)।

बेशक यह चिपकने का पता नहीं लगाएगा जब उपयोगकर्ता 1 या दो अक्षर चिपकाता है, और पाठ में परिवर्तन किसी और चीज से ट्रिगर होने पर गलत तरीके से रिपोर्टिंग की जाएगी।

लेकिन अधिकांश उद्देश्यों के लिए, यह काम पूरा हो जाता है।

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