Android: Setting EditText Max Chars per Line?

前端 未结 7 1641
再見小時候
再見小時候 2021-01-15 02:29

Is there any way to set a maximum of Chars to a line in an EditText Field? I tried it with a TextWatcher, But I cant really do what I want.

<
相关标签:
7条回答
  • 2021-01-15 02:55

    The following filter adds a new line after every n characters:

    public class AutoWrapFilter implements InputFilter {
        private final int mLineChars;
    
        public AutoWrapFilter(int pLineChars) {
            mLineChars = pLineChars;
        }
    
        @Override
        public CharSequence filter(CharSequence src, int srcStart, int srcEnd, Spanned dest, int destStart, int destEnd) {
            CharSequence original = dest.subSequence(0,destStart);
            CharSequence replacement = src.subSequence(srcStart,srcEnd);
    
            if(replacement.length() < 1){
                return null;
            }
    
            int lastLineCharIndex = -1;
    
            for (int j = destStart - 1; j >= 0; j--){
                if(original.charAt(j) == '\n'){
                    lastLineCharIndex = j;
                    break;
                }
            }
    
            int charsAfterLine = lastLineCharIndex < 0 ? original.length() : original.length() - lastLineCharIndex;
    
            StringBuilder sb = new StringBuilder();
    
            for (int k = 0; k < replacement.length(); k++){
    
                if(charsAfterLine == mLineChars+1){
                    charsAfterLine = 0;
                    sb.append('\n');
                }
    
                sb.append(replacement.charAt(k));
                charsAfterLine++;
    
            }
    
    
            return sb;
        }
    
        public static void applyAutoWrap(EditText et, int wrapLength){
            InputFilter[] filters = et.getFilters();
            InputFilter[] newFilters = Arrays.copyOf(filters, filters.length + 1);
            newFilters[filters.length] = new AutoWrapFilter(wrapLength);
            et.setFilters(newFilters);
        }
    }
    

    Usage:

    public class MyActivity extends Activity{
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            EditText edit = (EditText) findViewById(R.id.edit);
    
            AutoWrapFilter.applyAutoWrap(edit,10);
    
        }
    
    }
    

    Result:

    Sceenshot

    Also, you can add more code to append new-line char at word beginning, to make it wrap by word.

    0 讨论(0)
  • 2021-01-15 02:56

    You can use following properties:-

     android:maxLength="5";
    

    if want single line:-

         android:singleLine="true";
    

    else for fix lines:-

         android:maxLines="5";
    
    0 讨论(0)
  • 2021-01-15 03:07

    As you can see in above answers , you cant limit line length in edit text. But you can use text watcher that you mentioned to detect any changes in text. The override methods are self-explanatory in text watcher. Just make sure you dont edit, ie add text to the associated view when using text watcher. It will go in a recursive loop.

    0 讨论(0)
  • 2021-01-15 03:10

    Set these parameters in the layout:

    android:layout_width="30dip"
    android:singleLine="false"
    android:maxLines="5"
    

    Experiment with the value of android:layout_width to find the value that fits your needs.

    0 讨论(0)
  • 2021-01-15 03:11

    Add this in the layout:

    android:maxLength="10" // If you want 10 symbols entered in the EditText
    

    EDIT:

    android:lines="10" // For the numer of lines in the EditText
    
    0 讨论(0)
  • 2021-01-15 03:16
    String s="asaaskkjskjkajskjkajskajksjkfldfassasaasssssssssa.";
            int l=s.length();
            String y = "";
           for(int i=0;i<l;i+=20){
            int z=20;
            if(s.length()<z){
                z=s.length();
            }
            y=y+s.substring(0, z)+"\n";
            s=s.substring(z);
        }
        ((EditText)findViewById(R.id.editText1)).setText(y);
    
    0 讨论(0)
提交回复
热议问题