এডিটেক্সট জন্য লাইভ অক্ষর গণনা


104

আমি ভাবছিলাম যে কোনও সম্পাদনা-পাঠ্য বাক্সের লাইভ চরিত্রের গণনা করার সেরা উপায়টি অ্যান্ড্রয়েডে। আমি খুঁজছেন ছিল এই কিন্তু আমি এটা কোন অর্থে দেখা যায় বলে মনে হচ্ছে না পারে।

সমস্যাটি বর্ণনা করতে, আমার কাছে একটি সম্পাদনা পাঠ্য রয়েছে এবং আমি অক্ষরগুলি 150 এর মধ্যে সীমাবদ্ধ করার চেষ্টা করছি। আমি একটি ইনপুট ফিল্টার দিয়ে এটি করতে পারি, তবে আমি পাঠ্য বাক্সের ঠিক নীচে একজন ব্যবহারকারী প্রবেশ করানো অক্ষরের সংখ্যাটি প্রদর্শন করতে চাই (প্রায় স্ট্যাক ওভারফ্লো ঠিক এখন করছে)।

যদি কেউ উদাহরণ কোডের একটি ছোট স্নিপেট লিখতে বা আমাকে সঠিক দিকে নির্দেশ করতে পারে তবে আমি এটির অনেক প্রশংসা করব।

উত্তর:


154

পাঠ্যটি কখন পরিবর্তন হয়েছে তা দেখতে আপনি একটি টেক্সটওয়াচার ব্যবহার করতে পারেন

private TextView mTextView;
private EditText mEditText;
private final TextWatcher mTextEditorWatcher = new TextWatcher() {
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        public void onTextChanged(CharSequence s, int start, int before, int count) {
           //This sets a textview to the current length
           mTextView.setText(String.valueOf(s.length()));
        }

        public void afterTextChanged(Editable s) {
        }
};

আপনি সম্পাদনা পাঠ্যের সাথে পাঠ্য ওয়াচচার সেট করেছেন

mEditText.addTextChangedListener(mTextEditorWatcher);

5
এই চেষ্টা, দুর্দান্ত কাজ! সঠিক উত্তর হিসাবে নির্বাচন করা উচিত!
প্যাট্রিক বুস

4
পাঠ্য বাক্সের নীচে ডানদিকে গণনা যুক্ত করার সর্বোত্তম উপায় কী হবে। সম্পাদনা পাঠ্য প্রসারিত করুন এবং ম্যানুয়ালি স্ট্রিং আঁকুন?
বিয়ার

4
ধন্যবাদ আমিও এটি পেয়েছি, তবে কীভাবে পাঠ্য প্রবেশের সময় 150,149,148,147 এর মতো বিপরীত ক্রমে গণনা করব।
বিনে মানেটি

6
এটি mTextView.setText (String.valueOf (150-s.leight ())) এর সাথে প্রতিস্থাপনের মাধ্যমে সমাধান করা হয়েছে; এমটেক্সটভিউ.সেটটেক্সটের জায়গায় (স্ট্রিং.ভ্যালুওফ (s.leth ()));
বিনে মানেটি

আমার সমস্যাটি @ বিয়ারের মতোই। সম্পাদনা পাঠ্যের ঠিক নীচে আমার এই গণনা পাঠ্যটি দেখানো দরকার। এই রেফারেন্সে কারও ভাগ করার মতো কিছু আছে। ধন্যবাদ
সুরেশ শর্মা

109

আপনি XML নিজেই ব্যবহার থেকে অক্ষর গণনা করতে পারি না TextInputLayout editText জন্য মোড়কের চালু SupportLibrary v23.1

কেবলমাত্র আপনার সম্পাদনা পাঠ্যকে একটি পাঠ্য ইনপুটলয়েট দিয়ে মুড়িয়ে দিন এবং কাউন্টারএইনবেলটিকে সত্যতে সেট করুন এবং একটি কাউন্টারম্যাক্সেলংথ সেট করুন।

<android.support.design.widget.TextInputLayout
    android:id="@+id/textContainer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:counterEnabled="true"
    app:counterMaxLength="20"
    >
    <EditText
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Text Hint"
        />
</android.support.design.widget.TextInputLayout>

তোমার মত উপাদান প্রভাব পাবেন এই

কাউন্টারকে স্টাইল করার জন্য আপনি কাউন্টার ওভারফ্লো টেক্সট অ্যাপিয়েন্স , কাউন্টারটেক্সট অ্যাপিয়েন্স ব্যবহার করতে পারেন ।

সম্পাদনা

অ্যান্ড্রয়েড ডকুমেন্টেশন থেকে।

TextInputEditText বর্গ এই লেআউটটি সন্তান হিসাবে ব্যবহার করা যেতে প্রদান করা হয়। টেক্সটইনপুটএডিটটেক্সট ব্যবহার করে টেক্সটইনপুটটিকে কোনও পাঠ্য ইনপুটটির ভিজ্যুয়াল দিকগুলির উপর আরও বেশি নিয়ন্ত্রণের অনুমতি দেয়। উদাহরণ হিসাবে ব্যবহার যেমন:

     <android.support.design.widget.TextInputLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content">

     <android.support.design.widget.TextInputEditText
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:hint="@string/form_username"/>

 </android.support.design.widget.TextInputLayout>

টেক্সটইনপুট লেআউট টেক্সটইনপুট এডিটটেক্সট


4
এটি হ'ল আমি যা খুঁজছিলাম :) একটি পরিষ্কার, সমর্থন-লাইব্রেরি ইমপ্ল। ধন্যবাদ
ভিপিজেড

4
স্বীকৃত উত্তর হওয়া উচিত! আমি পুরোপুরি এই গুণাবলী মিস!
Sud007

26

আপনি এটি সহ TextInputLayoutএবং গ্রন্থাগারগুলির সাথে তুলনা করতে পারেন :

app:counterEnabled="true"
app:counterMaxLength="420"

এবং সম্পূর্ণ:

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:counterEnabled="true"
    app:counterMaxLength="420">

    <EditText
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:maxLength="420" />

</android.support.design.widget.TextInputLayout>

এটি আমার পক্ষে দুর্দান্ত কাজ করেছে, তবে আমি কীভাবে কাউন্টারটির রঙ পরিবর্তন করব?
এরিচ গার্সিয়া

14

এক্সএমএল এডিটেক্সট জন্য এই বৈশিষ্ট্য যুক্ত করুন

    android:maxLength="80"

জাভাতে এই শ্রোতা যুক্ত করুন

  ed_caption.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            tv_counter.setText(80 - s.toString().length() + "/80");

        }
    });

7

এটি খুব সহজ নীচের নির্দেশাবলী অনুসরণ করুন:

==== এগুলিকে আপনার আমদানিতে যুক্ত করুন ===

import android.text.Editable;
import android.text.TextWatcher;

===== এটি নির্ধারণ করুন ===== =

private TextView sms_count;

========== তৈরির ভিতরে ======

sms_count = (TextView) findViewById(R.id.textView2);


final TextWatcher txwatcher = new TextWatcher() {
   public void beforeTextChanged(CharSequence s, int start, int count, int after) {
   }

   public void onTextChanged(CharSequence s, int start, int before, int count) {

      sms_count.setText(String.valueOf(s.length()));
   }

   public void afterTextChanged(Editable s) {
   }
};

sms_message.addTextChangedListener(txwatcher);

5
    You can use TextWatcher class to see text has changed and how much number of character remains.Here i have set counter of 140 characters.

    EditText typeMessageToPost;
    TextView number_of_character;
public void onCreate(Bundle savedBundleInstance) {
        super.onCreate(savedBundleInstance);
setContentView(R.layout.post_activity);
typeMessageToPost.addTextChangedListener(mTextEditorWatcher);
}
private final TextWatcher mTextEditorWatcher=new TextWatcher() {

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

        }

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

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            number_of_character.setText(String.valueOf(140-s.length()));
        }
    };

ধন্যবাদ @ রবিশর্মা :) আমি আপনার মন্তব্যের প্রশংসা করি
রানা প্রতাপ সিং 13

4

TextInputLayoutআপনার এক্সএমএল ফাইলে কেবল এই 2 টি লাইন সেট করুন:

app:counterEnabled="true"
app:counterMaxLength="200"

গ্রেট যে সম্পর্কে জানতেন না। এটি একটি TextInputLayout এডিটেক্সট মোড়ানোর জন্য সর্বোত্তম সমাধান বলে মনে হয়।
স্টিফান স্প্রেঞ্জার

4

আপনি একটি টেক্সটইনপুটআউটলেটে মোড়ানো আপনার টেক্সটইনপুট এডিটটেক্সটে একটি কাউন্টার যুক্ত করতে পারেন। যেমন আপনি উদাহরণে দেখতে পাচ্ছেন, counterEnabledএই বৈশিষ্ট্যটি সক্ষম counterMaxLenghকরে এবং এর জন্য অক্ষরের সংখ্যা নির্ধারণ করে।

<com.google.android.material.textfield.TextInputLayout
        android:id="@+id/til_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:counterEnabled="true"
        app:counterMaxLength="50">
    <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/et_title"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
</com.google.android.material.textfield.TextInputLayout>

3

এই সমাধানটি Kotlinবাম অক্ষরের সংখ্যা ব্যবহার করে এবং দেখায়। এছাড়াও, যদি বর্তমানের অক্ষরের সংখ্যা 50 এর সীমা ছাড়িয়ে যায় তবে পাঠ্যের রঙটি লাল হয়ে যাবে।

কোটলিন

private val mTitleTextWatcher = object : TextWatcher {
    override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}

    override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
        if(YOUR_EDIT_TEXT_ID.text.toString().trim().length < 51){
            YOUR_CHAR_LEFT_TEXTVIEW_ID.text = (50 - YOUR_EDIT_TEXT_ID.text.toString().trim().length).toString()
            YOUR_CHAR_LEFT_TEXTVIEW_ID.setTextColor(Color.BLACK)
        }
        else{
            YOUR_CHAR_LEFT_TEXTVIEW_ID.text = "0"
            YOUR_CHAR_LEFT_TEXTVIEW_ID.setTextColor(Color.RED)
        }
    }

    override fun afterTextChanged(s: Editable) {}
}

এছাড়াও, অ্যাড করতে ভুলবেন না TextWatcherআপনারEditText

YOUR_EDIT_TEXT_ID.addTextChangedListener(mTitleTextWatcher)

2

আমি একই সমস্যার মুখোমুখি হয়েছি এবং আমি ক্যামেরনের পদ্ধতিটি চেষ্টা করেছি। এটি কাজ করে তবে একটি ছোটখাটো বাগ রয়েছে: ব্যবহারকারী যদি কপি এবং পেস্ট ব্যবহার করেন তবে এটি অক্ষর গণনা করতে ব্যর্থ। সুতরাং আমি নীচের মতো পাঠ্য পরিবর্তনের পরে করার পরামর্শ দিই:

    private final TextWatcher mTextEditorWatcher = new TextWatcher() {
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {

         }

         public void onTextChanged(CharSequence s, int start, int before, int count) {

         }

          public void afterTextChanged(Editable s) {
             //This sets a textview to the current length
             mTextView.setText(String.valueOf(s.length()));
         }
    };


0

এরকম কিছু করার চেষ্টা করুন।

এই সমাধানটি CharSequence.length পাওয়ার বিপরীতে আরও পারফরম্যান্সযুক্ত হতে পারে। প্রতিবার আপনি সফ্ট কীবোর্ডে ট্যাপ করলে ইভেন্টটি জ্বলে ওঠে; অতএব, আপনি যদি দৈর্ঘ্য করেন তবে এটি প্রতিবার CharSequence গণনা করবে, যদি আপনি বড় CharSequnces পেতে শুরু করেন তবে ধীর হতে পারে। পাঠ্য পরিবর্তনে ইভেন্ট শ্রোতা গণনার আগে এবং পরে তা পরীক্ষা করে। এটি ইনক্রিমেন্ট এবং হ্রাস মানগুলির জন্য ভাল কাজ করে

@Override
        public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
            int tick = start + after;
            if(tick < mMessageMax) {
                int remaining = mMessageMax - tick;
                ((TextView)findViewById(R.id.contact_us_chars)).setText(String.valueOf(remaining));
            }
        }

এটি ইফেক্ট পারমোসরেটস, টেক্সট ওয়াচারটি এর পক্ষে সেরা পন্থা
নাভিদ আহমদ

0

এটা চেষ্টা কর

private TextWatcher textWatcher = new TextWatcher() {
    @Override
    public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
        editText.post(new Runnable() {
            @Override
            public void run() {
                if (length < 100) {
                    if (count > 0 && after <= 0)/*remove emoij*/ {
                        length--;
                    } else if (count > after)/*remove text*/ {
                        length--;
                    } else if (count == 0 && after > 1)/*emoij*/ {
                        ++length;
                    } else if (count == 0 && after == 1)/*Text*/ {
                        ++length;
                    } else if (count > 0 && after > 1) {
                        ++length;
                    }
                    if (s.length() <= 0)
                        length = 0;
                    Log.w("MainActivity", " Length: " + length);
                } else {
                    if (count > 0 && after <= 0)/*remove emoij*/ {
                        length--;
                    } else if (count > after)/*remove text*/ {
                        length--;
                    }
                    Log.w("MainActivity", " Length: " + length);
                }

                if (length == 100) {
                    editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(s.length())});
                } else {
                    editText.setFilters(new InputFilter[]{});
                }
            }
        });
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {

    }
};

`


0

পরিষ্কার উপায়;

abstract class CharacterWatcher : TextWatcher {
    override fun afterTextChanged(text: Editable?) {
        afterCharacterChanged(text?.lastOrNull(), text?.length)
    }

    override fun beforeTextChanged(text: CharSequence?, start: Int, count: Int, before: Int) {}

    override fun onTextChanged(text: CharSequence?, start: Int, before: Int, count: Int) {}

    abstract fun afterCharacterChanged(char: Char?, count: Int?)
}



 editText.addTextChangedListener(new CharacterWatcher() {
            @Override
            public void afterCharacterChanged(@Nullable Character character, @Nullable Integer count) {
                action()
            }
        });
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.