AndroidでEditTextを作成して、ユーザーが複数行のテキストを入力できないようにしますが、表示はまだ複数行です(つまり、テキストの代わりにワードラップがあります右へ)?
これは、組み込みのSMSアプリケーションと似ていますが、改行を入力することはできませんが、テキストは複数行で表示されます。
ウィジェットをサブクラス化し、Enter
キーをブロックするためにキーイベント処理をオーバーライドします。
class MyTextView extends EditText
{
...
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode==KeyEvent.KEYCODE_ENTER)
{
// Just ignore the [Enter] key
return true;
}
// Handle all other keys in the default way
return super.onKeyDown(keyCode, event);
}
}
これはメソッドであり、EditTextクラスをオーバーライドする必要はありません。改行をキャッチして空の文字列に置き換えるだけです。
myEditTextObject.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void afterTextChanged(Editable s) {
for(int i = s.length(); i > 0; i--) {
if(s.subSequence(i-1, i).toString().equals("\n"))
s.replace(i-1, i, "");
}
String myTextString = s.toString();
}
});
XMLのプロパティ
Android:lines="5"
Android:inputType="textPersonName"
これは私のために働く:
<EditText
Android:inputType="textShortMessage|textMultiLine"
Android:minLines="3"
... />
Enterキーの代わりにスマイリーが表示されます。
@Andreas Rudolphが提供する回答には重大なバグが含まれているため、使用しないでください。複数の改行文字を含むIndexOutOfBoundsException
内のテキストを貼り付けると、コードによりEditText
が発生します。これは、使用されるループのタイプが原因で、Editable
オブジェクトは、その内容が変更(置換、削除、挿入)されるとすぐにafterTextChanged
メソッドを呼び出します。
正しいコード:
edittext.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void afterTextChanged(Editable s) {
/*
* The loop is in reverse for a purpose,
* each replace or delete call on the Editable will cause
* the afterTextChanged method to be called again.
* Hence the return statement after the first removal.
* http://developer.Android.com/reference/Android/text/TextWatcher.html#afterTextChanged(Android.text.Editable)
*/
for(int i = s.length()-1; i >= 0; i--){
if(s.charAt(i) == '\n'){
s.delete(i, i + 1);
return;
}
}
}
});
これを試して:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER)
{
//Nothing
return true;
}
return super.onKeyDown(keyCode, event);
}
私はこれをテストしていますが、うまくいくようです:
EditText editText = new EditText(context);
editText.setSingleLine(false);
editText.setInputType(Android.text.InputType.TYPE_CLASS_TEXT | Android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT);
次のようにxmlから設定できます。
Android:imeOptions="actionDone"
Android:inputType="text"
Android:maxLines="10"
Android:inputType="text"
を忘れないでください。設定しないと機能しません。なぜだかわかりません。また、maxLines
を好みの値に変更することを忘れないでください。
単に追加する
Android:singleLine="true"
あなたのEditTextに
IMEキーボードにEnterキーが表示されない、より正しい答えを次に示します。
// IMPORTANT, do this before any of the code following it
myEditText.setSingleLine(true);
// IMPORTANT, to allow wrapping
myEditText.setHorizontallyScrolling(false);
// IMPORTANT, or else your edit text would wrap but not expand to multiple lines
myEditText.setMaxLines(6);
また、setSingleLine(true)
を、XMLレイアウトファイル上の明示的なAndroid:inputType
、またはコード上のsetInputType(InputType.*)
のいずれかで置き換えることができます。入力を単一行のみに制限します(つまり、暗黙的にsetSingleLine(true)
を呼び出すものはすべて)。
説明:
setSingleLine(true)
が行うことは、setHorizontallyScrolling(true)
およびsetLines(1)
を暗黙的に呼び出すことと、IMEキーボード設定を変更してEnterキーを無効にすることです。
同様に、setLines(1)
への呼び出しは、1回の呼び出しでsetMinLines(1)
とsetMaxLines(1)
を呼び出すようなものです。
一部の入力タイプ(つまり、InputType.TYPE_*
の定数)は、暗黙的にsetSingleLine(true)
を呼び出すか、少なくとも同じ効果を達成します。
結論:
そのため、OPが望むものを実現するために、これらの暗黙的な呼び出しを元に戻すことで、それらの暗黙的な設定に単純に対抗します。
コードからアクションボタンを変更できます
editText.imeOptions = EditorInfo.IME_ACTION_DONE
editText.setRawInputType(InputType.TYPE_CLASS_TEXT)
XML
Android:inputType="textMultiLine"
改行を含むテキストをEditTextにコピーするまで、受け入れられた回答は非常にうまく機能しました。そこで、onTextContextMenuItemを追加して、貼り付けアクションを監視しました。
@Override
public boolean onTextContextMenuItem(int id) {
boolean ret = super.onTextContextMenuItem(id);
switch (id) {
case Android.R.id.paste:
onTextPaste();
break;
}
return ret;
}
public void onTextPaste() {
if (getText() == null)
return;
String text = getText().toString();
text = text.replaceAll(System.getProperty("line.separator"), " ");
text = text.replaceAll("\\s+", " ");
setText(text);
}
[〜#〜] uri [〜#〜] の場合、次を使用できます。
Android:inputType="textUri"
Android:lines="1"
Android:maxLength="128"
さもないと Android:inputType="textPersonName"
上記のように、ユーザー名などの他のEditTextで機能します。
これが解決策です...
<EditText
Android:id="@+id/editText"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:maxLength="150"
Android:textSize="15dp"
Android:imeOptions="actionDone"
Android:inputType="text|textMultiLine"/>
使用法Javaクラス
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int keyCode, KeyEvent event) {
if (keyCode==KeyEvent.KEYCODE_ENTER)
{
// Just ignore the [Enter] key
return true;
}
// Handle all other keys in the default way
return (keyCode == KeyEvent.KEYCODE_ENTER);
}
});
EditText textView = new EditText(activity);
...
textView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
if(KeyEvent.KEYCODE_ENTER == keyEvent.getKeyCode()) {
return false;
}
.......
}
});
<EditText
Android:id="@+id/Msg"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="5dip"
Android:lines="5"
Android:selectAllOnFocus="true"
Android:hint="Skriv meddelande...\n(max 100tkn)"/>
EditText et = (EditText)findViewById(R.id.Msg);
String strTmp = et.getText().toString();
strTmp = strTmp.replaceAll("\\n"," ");
EditTextをサブクラス化する必要がないように、別のオプションを提供します。改行を除外するInputFilter
を作成します。次に、EditText.addInputFilter
を使用します。
このような入力フィルターのソースコードは次のとおりです。 https://Gist.github.com/CapnSpellcheck/7c72830e43927380daf5205100c93977
コンストラクターで0を渡すことができ、改行は許可されません。また、これをAndroid:imeOptions="actionDone"
などの他の微調整の1つと組み合わせることができます。これにより、一部のデバイスでのエクスペリエンスが向上します。
このプロパティをEditText
XMLに追加するとうまくいきます:
Android:lines="1"
ユーザーは改行文字を入力できますが、EditText
自体の高さは増加しません。