<EditText
Android:id="@+id/editText2"
Android:layout_height="wrap_content"
Android:layout_width="fill_parent"
Android:maxLines="5"
Android:lines="5">
</EditText>
ユーザーは、Enter/Next Rowキーを押すことにより、5行以上を入力できます。 EditTextでユーザー入力を固定行数に制限するにはどうすればよいですか?
属性maxLines
はEditText
の最大高さに対応し、内側のテキスト行ではなく外側の境界を制御します。
<EditText
Android:id="@+id/edit_text"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:inputType="text"
Android:maxLines="1"
/>
属性「inputType」が設定されていることを確認する必要があります。この行がないと機能しません。
Android:inputType="text"
これは、n行に制限する一般的な問題を解決しません。 EditTextを1行のテキストのみに制限する場合、これは非常に簡単です。
これはxmlファイルで設定できます。
Android:singleLine="true"
またはプログラムで
editText.setSingleLine(true);
@Cedekasemあなたは正しいです、組み込みの「行リミッター」はありません。しかし、私は自分で自分自身を構築したので、誰かが興味を持っているなら、コードは以下にあります。乾杯。
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;
}
});
私はあなたたちが探していたようなことをしました。これが私の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);
}
}
私はこのための簡単な解決策を作成しました:D
// 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の値を必要に応じて変更できます。
以下に、EditTextで許可される行を制限するInputFilterを示します。
/**
* 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に追加するには:
editText.setFilters(new InputFilter[]{new MaxLinesInputFilter(2)});
これは私のプロジェクトで使用したものです:
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つのアプローチです。誰かを助けるかもしれない。
Android:lines="1"
Android:maxLines="1"
Android:inputType="text
最も簡単なソリューション:
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());
}
EditText
を1行に制限する別の方法は次のとおりです。
editText2.setTransformationMethod(new SingleLineTransformationMethod());
この変換方法を適用した後、Enterキーを押すとスペースが作成されることに注意してください。それはまだTSの質問を満たします。
行数に応じてテキストを制限できます
<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"/>
文字数の制限については、EditTextのmaxLengthプロパティを使用できます。ユーザーがこれ以上文字を入力できないようにするためです。
getLineCount()は1つのオプションです。ゼロ以外の値が必要な場合は、ビューが測定されていることを確認してください。ソフトキーボードの場合、onKeyListenerは機能しないため、入力時にテキストの変更を追跡するaddTextChangedListener()を追加する必要があります。コールバック内で十分な行を取得したらすぐに、それを制限するために必要な処理を実行します。getText()、setText()、またはもっと派手な文字を使用して文字を削除します。フィルターを使用して文字数を制限することもできます。
別のオプションは、getLineBounds()でテキストのサイズを監視することです。これはテキストの重力/パッドと相互作用しますので注意してください。
<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" />