I would like to create a text input that:
1) Always displays 3 lines
2) Does not allow the user to enter any more text than the available space in the 3 lines
3) Is not scrollable, if users enters text greater than 3 lines.
Technically, I allow for the user to enter up to 500 chars for saving to DB, but I am not expecting near this amount of text for the input. So, my usage of maxLength is only precautionary.
Here is my current EditText:
<EditText android:id="@+id/edit_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="3"
android:maxLines="3"
android:maxLength="500"
android:inputType="textMultiLine" />
Problem
The problem is that if the user enters text greater than 3 lines, the EditText adds additional lines and scrolls downward into the new line. It only limits the user to 500 characters.
To control the lines introduced you can add a TextWatcher so anytime the user introduces a new value you can handle an error (for example delete the lines after the third one and show a toast). You can check new lines with \r and \n.
http://developer.android.com/reference/android/text/TextWatcher.html
TextWatcher watcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
//here you can change edit text and show an error so the lines will never be 3
}
...}
EditText editText=findById(...);
editText.addTextChangedListener(watcher);;
The attribute maxLines corresponds to the maximum height of the EditText, it controls the outer boundaries and not inner text lines. You'll have to control manually how many characters a user can input into the EditText.
Something like this might work:
mEditText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
if ( ((EditText)v).getLineCount() > 3 )
return true;
}
return false;
}
});