2013-11-29 5 views
21

मेरे एंड्रॉइड प्रोजेक्ट में मुझे टेक्स्ट चेंज लिस्टनर (टेक्स्टवॉचर) को एक संपादन टेक्स्ट व्यू में जोड़ना पड़ा। और इसमें तीन हिस्से हैं।टेक्स्टवॉचर के ऑनटेक्स्ट चेंग्ड के बीच मतभेद, पहले टेक्स्टक्वांग और बाद में टेक्स्ट चेंज किया गया

  • onTextChanged
  • beforeTextChanged
  • afterTextChanged

इन तीन के विभिन्न क्या कर रहे हैं। मुझे मुख्य लिस्नर पर एक टेबल की खोज लागू करनी है और मेरे मामले के लिए ये सभी तीन समान दिखते हैं। इसके अलावा उन्होंने वही काम किया। जब मैं किसी उत्पाद नाम का एक हिस्सा इनपुट करता हूं तो तालिका केवल उन उत्पादों के साथ पुन: उत्पन्न होती है जिसमें उसमें टेक्स्ट दर्ज किया जाता है। लेकिन मैंने afterTextChanged भाग का उपयोग किया। मेरा कोड

EditProduct.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
      // TODO Auto-generated method stub 

      // System.out.println("onTextChanged"+s); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 
      // System.out.println("beforeTextChanged"+s); 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 
      // System.out.println("afterTextChanged"+s); 

      String new_prx = s.toString(); 

      System.out.println(s); 
      mini_productList = new ArrayList<Product>(); 

      // mini_productList 
      int count = 0; 
      if (new_prx.equals("")) { 

       loadtableProducts(productList); 

      } else { 

       for (int i = 0; i < productList.size(); i++) { 

        if (productList.get(i).getDescription().toString() 
          .substring(0, (new_prx.length())) 
          .equalsIgnoreCase(new_prx)) { 
         mini_productList.add(productList.get(i)); 
         count++; 

        } 

       } 

       loadtableProducts(mini_productList); 


      } 

     } 
    }); 

तो क्या कोई मुझे इन तीनों पर स्पष्टीकरण दे सकता है?

+1

आप इस सूत्र मिल सकती है मददगार http://stackoverflow.com/questions/476848/android-textwatcher-aftertextchanged-vs-textwatcher-ontextchanged –

उत्तर

14

onTextChanged पाठ बदलने के दौरान चलता है।

afterTextChanged पाठ बदलने के तुरंत बाद चलता है।

beforeTextChanged पाठ बदलने से पहले तुरंत चलाता है।

जब आप वैरिएबल असाइन करना चाहते हैं या चीजें करते हैं, तो आप परिवर्तन से पहले तुरंत या तुरंत बाद कोड को चलाने के लिए चाहते हैं।

यहाँ इस का एक उदाहरण है:

से पहले:

String afterTextChanged = ""; 
String beforeTextChanged = ""; 
String onTextChanged = ""; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    et = (EditText)findViewById(R.id.editText); 

    et.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int st, int b, int c) 
     { 
      onTextChanged = et.getText().toString(); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int st, int c, int a) 
     { 
      beforeTextChanged = et.getText().toString(); 
     } 

     @Override 
     public void afterTextChanged(Editable s) 
     { 
      afterTextChanged = et.getText().toString(); 
      Toast.makeText(Activity.this, "before: " + beforeTextChanged 
              + '\n' + "on: " + onTextChanged 
              + '\n' + "after: " + afterTextChanged 
          ,Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

इस मामले में, मान लीजिए कि आप "h" से पाठ बदल करने के लिए "हाय", उत्पादन होगा करते हैं: "h"
पर : "हाय"
के बाद: "हाय"

2
  • abstract void afterTextChanged(Editable s)

इस विधि आपको सूचित किया जाता है कि, कहीं रों भीतर, पाठ बदल दिया गया है कहा जाता है।

  • abstract void beforeTextChanged(CharSequence s, int start, int count, int after)

इस विधि आपको सूचित किया जाता है कि, रों भीतर, शुरू में शुरुआत गिनती पात्रों के बारे में के बाद लंबाई के साथ नया पाठ द्वारा प्रतिस्थापित किया जा करने के लिए कर रहे हैं कहा जाता है।

  • abstract void onTextChanged(CharSequence s, int start, int before, int count)

इस विधि आपको सूचित किया जाता है कि, रों भीतर, शुरू में शुरुआत गिनती पात्रों सिर्फ पुराने पाठ कि पहले लंबाई था जगह ले ली है कहा जाता है।

आप here और अधिक सीख सकते हैं।

18

एंड्रॉइड TextChangedListener एक प्रकार का ट्रिगर है जिसे इनपुट फ़ील्ड के टेक्स्ट चेंज पर बुलाया जाता है।

TextChangedListener में तीन घटनाएं हैं।

1. पहले से टेक्स्ट चेंज: इसका मतलब है कि पात्रों को कुछ नए पाठ के साथ प्रतिस्थापित किया जा रहा है। पाठ असंभव है। इस घटना का उपयोग तब किया जाता है जब आपको पुराने पाठ को देखने की आवश्यकता होती है जो बदलने वाला है।

2.onTextChanged: परिवर्तन किए गए हैं, कुछ पात्रों को अभी बदल दिया गया है। पाठ असंभव है। इस घटना का उपयोग तब किया जाता है जब आपको यह देखने की आवश्यकता होती है कि पाठ में कौन से वर्ण नए हैं।

3.afterTextChanged: उपर्युक्त जैसा ही है, सिवाय इसके कि पाठ संपादन योग्य है। इस घटना का उपयोग तब किया जाता है जब आपको नया टेक्स्ट देखने और संभवतः संपादित करने की आवश्यकता होती है।

+0

क्या हुआ अगर मैं पाठ की बदलती पर चिंता करने की जरूरत है, मेरा मतलब परिवर्तन के बाद है। मैंने उसी कोड स्निपेट का उपयोग किया जिसे मैंने बाद में वर्णित किया था। यह मुझे एक ही आउटपुट दिया। –

+0

मुझे वह नहीं मिला जो आप कहने की कोशिश कर रहे हैं! ontextchanged और aftertextchange एक ही आउटपुट देगा –

+1

जब आप कहते हैं कि टेक्स्ट संपादन योग्य/अयोग्य है, तो "टेक्स्ट" का क्या अर्थ है? – Jonas

-1
  1. बाद के बाद (संपादन योग्य) - पाठ को बदलते समय इस विधि को बुलाया जाता है। चूंकि आपके द्वारा किए गए कोई भी बदलाव इस विधि को फिर से कॉल करने के लिए कारण बनेंगे, आपको प्रदर्शन परिचालनों के बारे में सतर्क रहना होगा, अन्यथा यह अनंत लूप का कारण बन सकता है।

  2. beforeTextChanged (CharSequence रों, पूर्णांक शुरू, पूर्णांक गिनती, पूर्णांक के बाद) - इस विधि आपको सूचित किया जाता है कि, रों भीतर, शुरू में शुरुआत गिनती पात्रों के बारे में नया पाठ द्वारा प्रतिस्थापित किया जा करने के लिए कर रहे हैं कहा जाता है लंबाई के साथ। यह कॉलबैक से इस कॉलबैक में परिवर्तन करने का प्रयास करने में त्रुटि है।

  3. onTextChanged (CharSequence रों, पूर्णांक शुरू, इससे पहले कि पूर्णांक, पूर्णांक गिनती) - इस विधि कि, रों भीतर, शुरू में शुरुआत गिनती पात्रों सिर्फ पुराने पाठ कि लंबाई था जगह ले ली है आपको सूचित करने को कहा जाता है पहले। यह कॉलबैक से इस कॉलबैक में परिवर्तन करने का प्रयास करने में त्रुटि है।

6

beforeTextChanged और onTextChanged के लिए मानकों एक छोटे से पहली बार में समझने के लिए मुश्किल है। उदाहरण के लिए उन्हें इस्तेमाल करने में मददगार हो सकता है। निम्नलिखित प्रदर्शन कुछ बार देखें। गणना पर ध्यान दें।

  • लाल उजागर पुराने पाठ है कि के बारे में हरे पाठ द्वारा प्रतिस्थापित किया जा रहा है।
  • हरा हाइलाइट नया टेक्स्ट है जो सिर्फ लाल टेक्स्ट को प्रतिस्थापित करता है।

enter image description here

beforeTextChanged

  • start लाल की शुरुआत सूचकांक पाठ पर प्रकाश डाला
  • countलाल पर प्रकाश डाला पाठ की लंबाई है (उस के बारे में हटाया जाने वाला है) है (जो हटाया जा रहा है)
  • after एल है हरी हाइलाइट किए गए पाठ के ength (उस के बारे में जोड़े जाने के लिए है)

onTextChanged

  • start हरी के शुरू होने से सूचकांक पाठ पर प्रकाश डाला (कि हाल ही में जोड़े गया) है।
    यह beforeTextChanged के समान है।
  • beforeलाल की लंबाई है जो हाइलाइट किया गया टेक्स्ट (जिसे अभी हटा दिया गया है)।
    यह beforeTextChanged के count जैसा ही है।
  • countकी लंबाई हाइलाइट किए गए टेक्स्ट (जो अभी जोड़ा गया है) की लंबाई है।
    के after जैसा ही है।

afterTextChanged

  • editable EditText से संपादन योग्य पाठ है। आपको इसे यहां बदलने की अनुमति है। ऐसा करने से सभी TextWatcher ईवेंट फिर से ट्रिगर हो जाएंगे।
  • आपको क्या बदला गया था इसके बारे में कोई जानकारी नहीं दी गई है। यदि आप जानना चाहते हैं, तो आप onTextChanged में एक अवधि सेट कर सकते हैं और फिर यहां स्पैन देखें।

किस का उपयोग करना है?

यदि आप किए गए परिवर्तनों का निरीक्षण करना चाहते हैं, तो beforeTextChanged() या onTextChanged() का उपयोग करें। हालांकि, इन तरीकों में से किसी एक में आपको CharSequence टेक्स्ट बदलने की अनुमति नहीं है।

यदि आप इसे बदलने के बाद पाठ को और संशोधित करना चाहते हैं, तो इसे afterTextChanged() में करें।

कोड

यहाँ कोड आप इसके साथ अपने आप को चारों ओर खेलने के लिए चाहते हैं।

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    final static int RED_COLOR = Color.parseColor("#fb7373"); 
    final static int GREEN_COLOR = Color.parseColor("#40de83"); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     EditText editText = findViewById(R.id.editText); 
     final TextView tvBeforeText = findViewById(R.id.tvBeforeText); 
     final TextView tvBeforeNumbers = findViewById(R.id.tvBeforeNumbers); 
     final TextView tvAfterText = findViewById(R.id.tvAfterText); 
     final TextView tvAfterNumbers = findViewById(R.id.tvAfterNumbers); 

     editText.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
       SpannableString spannableString = new SpannableString(s); 
       BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(RED_COLOR); 
       spannableString.setSpan(backgroundSpan, start, start + count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
       tvBeforeText.setText(spannableString); 
       tvBeforeNumbers.setText("start=" + start + " count=" + count + " after=" + after); 
      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       SpannableString spannableString = new SpannableString(s); 
       BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(GREEN_COLOR); 
       spannableString.setSpan(backgroundSpan, start, start + count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
       tvAfterText.setText(spannableString); 
       tvAfterNumbers.setText("start=" + start + " before=" + before + " count=" + count); 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       Log.i("TAG", "afterTextChanged: " + s); 
      } 
     }); 
    } 
} 

activity_main।एक्सएमएल

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="5dp"> 

    <EditText 
     android:id="@+id/editText" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="20sp" 
     android:text="beforeTextChanged" /> 

    <TextView 
     android:id="@+id/tvBeforeText" 
     android:textSize="17sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:id="@+id/tvBeforeNumbers" 
     android:textSize="17sp" 
     android:text="start=0 count=0 after=0" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="20sp" 
     android:layout_marginTop="20dp" 
     android:text="onTextChanged" /> 

    <TextView 
     android:id="@+id/tvAfterText" 
     android:textSize="17sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:id="@+id/tvAfterNumbers" 
     android:textSize="17sp" 
     android:text="start=0 count=0 after=0" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 
संबंधित मुद्दे