এডিটেক্সট ম্যাক্সলাইন কাজ করছে না - ব্যবহারকারী এখনও সেট-এর চেয়ে বেশি লাইন ইনপুট করতে পারে


126
<EditText 
    android:id="@+id/editText2" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" 
    android:maxLines="5" 
    android:lines="5">
</EditText>

এন্টার / পরবর্তী সারি কী টিপে ব্যবহারকারী 5 টিরও বেশি লাইন ইনপুট করতে পারেন। আমি কীভাবে ব্যবহারকারীর ইনপুটটিকে এডিট টেক্সট সহ স্থির পরিমাণের সারিতে সীমাবদ্ধ করতে পারি?


: এই পোস্টটিকে দেখতে পারবেন stackoverflow.com/questions/14672234/...
আলী safaei

উত্তর:


84

বৈশিষ্ট্যটি maxLinesসর্বাধিক উচ্চতার সাথে মিলে যায় EditText, এটি বাইরের সীমানা নিয়ন্ত্রণ করে, অভ্যন্তরীণ পাঠ্য লাইনগুলিকে নয়।


আমি যা ভেবেছিলাম তাও স্থগিত করে ... ইনপুটড রেখাগুলি সীমাবদ্ধ করার কোনও উপায় আছে বা আমার কাছে প্রোগ্রামিকভাবে ব্যাকএন্ড কোডে এটি আছে?
ইন্দ্রেয়েক কিউ

আপনার পছন্দ মতো ইনপুটড লাইনগুলিকে সীমাবদ্ধ করার সহজ উপায় নেই। আপনার কোডে এটি আপনাকে ম্যানুয়ালি করতে হবে।
সিডেকেসমে

3
আমি মনে করি কোনও বিকাশকারীকে "ম্যাক্সলাইনস" সর্বাধিক সংখ্যক রেখাকে বোঝায় যা এডিটেক্সট দিয়ে সম্ভব হওয়া উচিত। আমি যদি কেবল একটি নির্দিষ্ট উচ্চতা চাইতাম তবে আমি "লাইনগুলি" ব্যবহার করতাম। : - /
অন্য কোথাও

241
<EditText
    android:id="@+id/edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="text"
    android:maxLines="1" 
/>

আপনাকে কেবল "ইনপুট টাইপ" বৈশিষ্ট্যটি সেট করে আছে তা নিশ্চিত করতে হবে। এই লাইন ছাড়া এটি কাজ করে না।

android:inputType="text"

3
@ নিওল চিবো আপনি ঠিক বলেছেন! আমি সেট inputTypeকরার পরে কাজ text। আমার সময় বাঁচানোর জন্য ধন্যবাদ :-)
জীবন

6
@ জীবন, আমি সবসময় ভেবেছিলাম ইনপুট টাইপের "পাঠ্য" এর একটি ডিফল্ট মান রয়েছে। অনুমান আমি ভুল ছিল।
নোয়েল চিউ

2
খুব অদ্ভুত যে পাঠ্যটি ইনপুট টাইপের জন্য ডিফল্ট মান সেট নয়, দুর্দান্ত উত্তর যদিও
মুহাম্মদ রেফায়াত

9
এটি কেবলমাত্র 1 এর ম্যাক্সলাইনগুলির জন্য কাজ করে তবে আপনি নতুন লাইন যুক্ত করতে পারবেন না
ড্যানিয়েল রাউফ

68

এটি এন লাইনগুলিতে সীমাবদ্ধ থাকার সাধারণ সমস্যাটি সমাধান করে না। আপনি যদি নিজের সম্পাদনা পাঠ্যকে মাত্র 1 লাইন পাঠ্য সীমাবদ্ধ করতে চান তবে এটি খুব সহজ হতে পারে।
আপনি এটি এক্সএমএল ফাইলে সেট করতে পারেন।

android:singleLine="true"

বা প্রোগ্রামগতভাবে

editText.setSingleLine(true);

8
তবে আপনি যদি 2 সারি সীমাবদ্ধ করতে চান? বা 3? তার জন্য আপনাকে কাস্টম সারি সীমাবদ্ধতা তৈরি করতে হবে ...
ইন্দ্রেক কোভ

4
আমি যে সচেতন। "এটি এন লাইনের মধ্যে সীমাবদ্ধ করার সাধারণ সমস্যাটিকে সমাধান করে না"। আমি এখানে 1 টি লাইনের সীমাবদ্ধ করার চেষ্টা করার সময় প্রশ্নটি পড়ে শেষ করেছি এবং একটি সহজ সমাধান খুঁজে পেয়েছি। আমি অনুভব করেছি যে অন্যরা এখানে তাদের সম্পাদনা পাঠকে 1 লাইনে সীমাবদ্ধ করতে এবং "কাস্টম সারি সীমাবদ্ধকারী" প্রয়োগ করতে পারে। আমার উত্তরটি এখানে অন্যান্য এসও ব্যবহারকারীদের জন্য যারা এই প্রশ্নটি একই কারণে অনুসন্ধান করে শেষ করেন for
জেসি ব্ল্যাক

@ ইন্দ্রেইককিউ যা খুব বেশি শক্ত হওয়া উচিত নয়।
ডন ল্যারিক্স

10
সিঙ্গললাইন হ্রাস করা হয়
আলী

1
এডিটেক্সটসের অ্যাট্রিবিউট সিঙ্গললাইন = "সত্য" অবমূল্যায়ন করা হয়েছে এবং এটি ক্র্যাশ হতে চলেছে ডিভাইসগুলি অ্যান্ড্রয়েড 7.০ এর চেয়ে বড় ব্যবহার করছে
ট্রানহিয়ু

24

@ সিডিক্যাসেম আপনি ঠিক বলেছেন, "সারি সীমাবদ্ধ" সেখানে অন্তর্নির্মিত নেই। তবে আমি একটি আমার স্ব তৈরি করেছি, তাই যদি কেউ আগ্রহী হয় তবে কোডটি নীচে। চিয়ার্স।

et.setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            // if enter is pressed start calculating
            if (keyCode == KeyEvent.KEYCODE_ENTER
                    && event.getAction() == KeyEvent.ACTION_UP) {

                // get EditText text
                String text = ((EditText) v).getText().toString();

                // find how many rows it cointains
                int editTextRowCount = text.split("\\n").length;

                // user has input more than limited - lets do something
                // about that
                if (editTextRowCount >= 7) {

                    // find the last break
                    int lastBreakIndex = text.lastIndexOf("\n");

                    // compose new text
                    String newText = text.substring(0, lastBreakIndex);

                    // add new text - delete old one and append new one
                    // (append because I want the cursor to be at the end)
                    ((EditText) v).setText("");
                    ((EditText) v).append(newText);

                }
            }

            return false;
        }
});

এটি ব্যবহারকারীর জন্য একটি স্ব-স্বজ্ঞাত পার্শ্ব-প্রতিক্রিয়া রয়েছে। উদাহরণস্বরূপ, যদি আপনার সম্পাদনা পাঠ্যে 7 টি লাইন থাকে এবং তারপরে এন্টার টিপুন, তবে আপনি আপনার পাঠ্যের শেষ লাইনে বাই-বাই বলতে পারেন।
মাইগুয়েল.মার্টিন

আপনি যদি এতে ম্যাক্সলাইনস পাঠ্যের চেয়ে বেশি পেস্ট করেন তবে কাজ করবে না। অ্যাডটেক্সট চ্যাঞ্জডলিস্টনার ব্যবহার করা আরও ভাল।
কুলদীপ সখিয়া

13

আপনি ছেলেরা যেমন খুঁজছিল তেমন আমি কিছু করেছি। এখানে আমার LimitedEditTextক্লাস।

বৈশিষ্ট্য:

  • আপনি আপনার লিমিটেড এডিটটেক্সট উপাদানটিতে লাইন গণনা সীমাবদ্ধ করতে পারেন
  • আপনি আপনার লিমিটেডএডিটটেক্সট উপাদানটিতে অক্ষর গণনা সীমাবদ্ধ করতে পারেন
  • আপনি যদি পাঠ্যের মাঝখানে কোথাও অক্ষর বা রেখার সীমা অতিক্রম করেন তবে কার্সার
    আপনাকে শেষ পর্যন্ত আনবে না - এটি যেখানে থাকবে আপনি সেখানেই থাকবেন।

আমি শ্রোতাদের বন্ধ করছি, কারণ প্রতিটি কল setText() যখন ব্যবহারকারী প্রতিটি অক্ষর বা রেখার সীমা অতিক্রম করে তখন পদ্ধতির পুনরাবৃত্তভাবে এই 3 টি কলব্যাক পদ্ধতি কল করে।

কোড:

import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.EditText;
import android.widget.Toast;

/**
* EditText subclass created to enforce limit of the lines number in editable
* text field
*/
public class LimitedEditText extends EditText {

/**
 * Max lines to be present in editable text field
 */
private int maxLines = 1;

/**
 * Max characters to be present in editable text field
 */
private int maxCharacters = 50;

/**
 * application context;
 */
private Context context;

public int getMaxCharacters() {
    return maxCharacters;
}

public void setMaxCharacters(int maxCharacters) {
    this.maxCharacters = maxCharacters;
}

@Override
public int getMaxLines() {
    return maxLines;
}

@Override
public void setMaxLines(int maxLines) {
    this.maxLines = maxLines;
}

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

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

public LimitedEditText(Context context) {
    super(context);
    this.context = context;
}

@Override
protected void onFinishInflate() {
    super.onFinishInflate();

    TextWatcher watcher = new TextWatcher() {

        private String text;
        private int beforeCursorPosition = 0;

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {                
            //TODO sth
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            text = s.toString();
            beforeCursorPosition = start;
        }

        @Override
        public void afterTextChanged(Editable s) {

            /* turning off listener */
            removeTextChangedListener(this);

            /* handling lines limit exceed */
            if (LimitedEditText.this.getLineCount() > maxLines) {
                LimitedEditText.this.setText(text);
                LimitedEditText.this.setSelection(beforeCursorPosition);
            }

            /* handling character limit exceed */
            if (s.toString().length() > maxCharacters) {
                LimitedEditText.this.setText(text);
                LimitedEditText.this.setSelection(beforeCursorPosition);
                Toast.makeText(context, "text too long", Toast.LENGTH_SHORT)
                        .show();
            }

            /* turning on listener */
            addTextChangedListener(this);

        }
    };

    this.addTextChangedListener(watcher);
}

}

2
এই সমাধানটি এত সহজ এবং মার্জিত! ধন্যবাদ
গিলাহ

আমি ব্যবহার beforeCursorPosition = getSelectionStart();মধ্যে afterTextChangedকলব্যাক। এটা তোলে ভাল কাজ করে কারণ যখন টাইপিং eলেখার পরে abcd, editText 'মনে' হয়তো প্রতিস্থাপন abcdসঙ্গে abcde, ইনপুট পদ্ধতি কারণে।
হ্যানসুইম

11

আমি এর জন্য সহজ সমাধান করেছি: ডি

// set listeners
    txtSpecialRequests.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            lastSpecialRequestsCursorPosition = txtSpecialRequests.getSelectionStart();
        }

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

        }

        @Override
        public void afterTextChanged(Editable s) {
            txtSpecialRequests.removeTextChangedListener(this);

            if (txtSpecialRequests.getLineCount() > 3) {
                txtSpecialRequests.setText(specialRequests);
                txtSpecialRequests.setSelection(lastSpecialRequestsCursorPosition);
            }
            else
                specialRequests = txtSpecialRequests.getText().toString();

            txtSpecialRequests.addTextChangedListener(this);
        }
    });

আপনি txtSpecialRequests.getLineCount() > 3আপনার প্রয়োজন অনুসারে 3 এর মান পরিবর্তন করতে পারেন ।


3
আপনাকে অনেক ধন্যবাদ, অবশেষে একাধিক ভুল সমাধানের পরে কাজ করেছে। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
eyadMhanna

আমি পেয়েছি যে "txtSpecialRequests" আপনার editText ধারক, তবে আপনি শেষের স্পেসিফিকালকিউক্রাস্টার্সপোজার এবং বিশেষ অনুসন্ধানগুলি কোথায় পরিবর্তন করবেন?
drearypanoramic

এই পদ্ধতির বাইরে অবশ্যই :) আর্ট লাস্ট স্পেশালইকোয়েস্টস কর্সারপজিশন = 0 এবং স্পেশাল রেকুয়েস্টস = ""
অস্কার ইউয়ান্ডিনটা

দুর্দান্ত সমাধান!
মার্কাস

5

এখানে এমন একটি ইনপুটফিলার রয়েছে যা সম্পাদনা পাঠ্যে অনুমোদিত লাইনগুলিকে সীমাবদ্ধ করে:

/**
 * Filter for controlling maximum new lines in EditText.
 */
public class MaxLinesInputFilter implements InputFilter {

  private final int mMax;

  public MaxLinesInputFilter(int max) {
    mMax = max;
  }

  public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    int newLinesToBeAdded = countOccurrences(source.toString(), '\n');
    int newLinesBefore = countOccurrences(dest.toString(), '\n');
    if (newLinesBefore >= mMax - 1 && newLinesToBeAdded > 0) {
      // filter
      return "";
    }

    // do nothing
    return null;
  }

  /**
   * @return the maximum lines enforced by this input filter
   */
  public int getMax() {
    return mMax;
  }

  /**
   * Counts the number occurrences of the given char.
   *
   * @param string the string
   * @param charAppearance the char
   * @return number of occurrences of the char
   */
  public static int countOccurrences(String string, char charAppearance) {
    int count = 0;
    for (int i = 0; i < string.length(); i++) {
      if (string.charAt(i) == charAppearance) {
        count++;
      }
    }
    return count;
  }
}

এডিট টেক্সটে এটি যুক্ত করতে:

editText.setFilters(new InputFilter[]{new MaxLinesInputFilter(2)});

ভাল সমাধান, তবে এটি পাঠ্য মোড়ানোর সমস্যাটি প্রবেশ করে না (প্রবেশ করায় না)
পিটার ফাইল

4

আমি আমার প্রকল্পে এটি ব্যবহার করেছি:

editText.addTextChangedListener(new TextWatcher() {
    private String text;

public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {    
}

public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
    text = arg0.toString();
    }

public void afterTextChanged(Editable arg0) {
    int lineCount = editText.getLineCount();
    if(lineCount > numberOfLines){
    editText.setText(text);
    }
}
});

editText.setOnKeyListener(new View.OnKeyListener() {

public boolean onKey(View v, int keyCode, KeyEvent event) {

// if enter is pressed start calculating
    if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN){    
    int editTextLineCount = ((EditText)v).getLineCount();
    if (editTextLineCount >= numberOfLines)
        return true;
}

return false;
}
});

এবং এটি সমস্ত পরিস্থিতিতে কাজ করে


1
টেক্সট ওয়াচারের কোন প্রসঙ্গে প্রয়োজন? কী লিস্টেনারটি আমার প্রয়োজন ছিল।
অ্যালানকলে

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

আমি দেখি. এই স্পষ্টির জন্য ধন্যবাদ।
অ্যালানকলে

@ অ্যালানকলে আপনি যদি আমার উত্তরটি কার্যকর মনে করেন তবে দয়া করে এটির জন্য ভোট দিন।
পাইরেট

টেক্সটচেনজড (সম্পাদনাযোগ্য arg0) এর পরে সর্বজনীন শূন্য {int lineCount = editText.getLineCount (); যদি (লাইনকাউন্ট> নম্বরআফলাইনস) {editText.setText (পাঠ্য); }} একটি StackOverflowException নিক্ষেপ হবে ...
desgraci


3

সহজ সমাধান:

android:maxLines="3"

...

 @Override
public void afterTextChanged(Editable editable) {
    // limit to 3 lines
    if (editText.getLayout().getLineCount() > 3)
        editText.getText().delete(editText.getText().length() - 1, editText.getText().length());
}



1

আপনার EditTextএক লাইনে সীমাবদ্ধ করার অন্য উপায়টি হ'ল:

editText2.setTransformationMethod(new SingleLineTransformationMethod());

নোট করুন যে এই রূপান্তর পদ্ধতিটি প্রয়োগ করার পরে, এন্টার কী চাপলে স্পেস তৈরি করে। এটি এখনও টিএসের প্রশ্নকে সন্তুষ্ট করে।


নতুন লাইন লুকানোর দুর্দান্ত উপায়! মান হিসাবে, তবে, এখনও একটি 'নতুন লাইন' চরিত্র থাকবে !!
গ্রেগরি স্টেইন

1

আমি আপনার লাইনের কোনও সংখ্যা অনুসারে আপনার পাঠ্য সীমাবদ্ধ করতে পারি আমি বলছি এক লাইনে প্রায় 37 টি বর্ণমালা

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:lines="4"
    android:maxLines="4"
    android:minLines="4"
    android:maxLength="150"
    android:gravity="start"
    android:background="#efeef5"
    android:layout_marginTop="@dimen/pad_10dp"/>

0

getLineCount () একটি বিকল্প; যদি আপনি সেখানে অ-শূন্য মান চান তবে আপনার দৃষ্টিভঙ্গিটি পরিমাপ করা হয়েছে তা নিশ্চিত করুন। সফট কীবোর্ডের জন্য কী-লিসটনার কাজ করবে না সুতরাং আপনাকে অ্যাডটেক্সট চেঞ্জডলিস্টার যুক্ত করতে হবে যা আপনার টাইপ করার সাথে সাথে পাঠ্য পরিবর্তনগুলি ট্র্যাক করবে। এর কল ব্যাকের ভিতরে পর্যাপ্ত লাইনগুলি পাওয়ার সাথে সাথে আপনি এটি সীমাবদ্ধ করতে চান যা কিছু করুন: getText (), সেটটেক্সট () বা আরও অভিনব কিছু দিয়ে অক্ষর মুছুন। আপনি এমনকি একটি ফিল্টার ব্যবহার করে অক্ষরের সংখ্যা সীমাবদ্ধ করতে পারেন।

আর একটি বিকল্প হ'ল getLineBounds () সহ পাঠ্যের আকার নিরীক্ষণ করা। এটি পাঠ্যের মাধ্যাকর্ষণ / প্যাডগাইনের সাথে ইন্টারেক্ট করবে তাই সাবধানতা অবলম্বন করুন।


0

অক্ষরের সংখ্যার সীমাবদ্ধতার জন্য আমরা সহজেই এডিটেক্সট এর সর্বোচ্চ দৈর্ঘ্য সম্পত্তি ব্যবহার করতে পারি কারণ এটি ব্যবহারকারীর আরও অক্ষর প্রবেশ করতে দেয় না।


0
        <EditText
            android:id="@+id/usrusr"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:gravity="center"
            android:lines="1"
            android:maxLines="1"
            android:inputType="text"
            android:hint="@string/inventory_no" />

0

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

 // Set listener to wishDescriptionEditText in order to limit line number
    editText.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) {
            // If line account is higher than MAX_LINES, set text to lastText
            // and notify user (by Toast)
            if (editText.getLineCount() > MAX_LINES) {
                editText.setText(lastText);
                Toast.makeText(getContext(), "Please keep it short", Toast.LENGTH_LONG).show();
            } else {
                lastText = editText.getText().toString();
            }
        }
    });

0

এটি কোটলিনের ইন্দ্রেক কিউ উত্তরের একটি বর্ধিতাংশ

                input_name.addTextChangedListener(object : TextWatcher {
                override fun afterTextChanged(s: Editable?) {}

                override fun beforeTextChanged(
                    s: CharSequence?,
                    start: Int,
                    count: Int,
                    after: Int
                ) {
                }

                @SuppressLint("SetTextI18n")
                override fun onTextChanged(
                    s: CharSequence?,
                    start: Int,
                    before: Int,
                    count: Int
                ) {
                    val text = (input_name as EditText).text.toString()
                    val editTextRowCount = input_name.lineCount
                    if (editTextRowCount > 15) {
                        val newText = text.substring(0, text.length - 1)
                        input_name.setText("")
                        input_name.append(newText)
                    }
                }
            })

-4

এক্সএমএল ফাইলের মধ্যে সম্পাদনা পাঠের বৈশিষ্ট্যগুলির নীচের সংমিশ্রণটি ব্যবহার করে দেখুন:

android:singleLine="true"
android:maxLength="22"


2
শুধু একটি মাথা আপ. সিঙ্গললাইন হ্রাস করা হয়। একক লাইনের জায়গায় ম্যাক্সলাইন চালু হয়েছিল।
সন্দীপ আর

@SandeepR আপনারা ভুল করছেন, android:inputTypeব্যবহার প্রতিস্থাপনandroid:singleLine
পিয়ের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.