EditText
のkeyListener
の値を変更しています。
しかし、テキストを変更すると、カーソルはEditText
の先頭に移動します。カーソルをテキストの最後に置く必要があります。
EditText
内のテキストの末尾にカーソルを移動する方法。
これを試して:
EditText et = (EditText)findViewById(R.id.inbox);
et.setSelection(et.getText().length());
現在のedittextの値に文字列の値を追加してカーソルを値の末尾に配置する、append for ediitextという関数があります。文字列値を現在の編集テキスト値そのものにしてappend()を呼び出すことができます。
myedittext.append("current_this_edittext_string");
Kotlin:
カーソルを開始位置に設定します。
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(0)
カーソルをEditTextの終わりに設定します。
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(editText.getText().length())
コードの下には、カーソル2番目の文字の後:を置きます。
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(2)
Java:
カーソルを開始位置に設定します。
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(0);
カーソルをEditTextの終わりに設定します。
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());
コードの下には、カーソル2番目の文字の後:を置きます。
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);
以前にsetText
を呼び出していて、新しいテキストがレイアウトフェーズにならなかった場合は、View.post(Runnable)
によって起動される別のランナブルでsetSelection
を呼び出します( this topicからの再投稿)。
だから、私にとっては、このコードは動作します:
editText.setText("text");
editText.post(new Runnable() {
@Override
public void run() {
registerPhone.setSelection("text".length());
}
});
次のようにEditText
ビューでテキストの末尾にカーソルを置くこともできます。
EditText et = (EditText)findViewById(R.id.textview);
int textLength = et.getText().length();
et.setSelection(textLength, textLength);
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
editText.setSelection(editText.getText().length());
return false;
}
});
これは別の可能な解決策です:
et.append("");
何らかの理由でうまくいかない場合は、この解決方法を試してください。
et.setSelection(et.getText().length());
私の場合は、次のようなkotlin extを作成しました。機能、誰かに役立つかもしれません
private fun EditText.focus(){
requestFocus()
setSelection(length())
}
それから次のように使ってください
mEditText.focus()
あなたはEditTextのメソッドsetSelection()でそれを達成することができるはずです/を見てください - ここ
/**
* Set cursor to end of text in edittext when user clicks Next on Keyboard.
*/
View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if (b) {
((EditText) view).setSelection(((EditText) view).getText().length());
}
}
};
mEditFirstName.setOnFocusChangeListener(onFocusChangeListener);
mEditLastName.setOnFocusChangeListener(onFocusChangeListener);
それは私のためにうまくいきます!
私はこれがあなたが望むものを達成できると思います。
Editable etext = mSubjectTextEditor.getText();
Selection.setSelection(etext, etext.length());
あなたのEditTextが明確でないならば:
editText.setText("");
editText.append("New text");
この質問は古くからあるものですが、新しくリリースされたAndroid用DataBindingツールを使用する場合は、この回答をXMLに設定しておくと便利です。
<data>
<variable name="stringValue" type="String"/>
</data>
...
<EditText
...
Android:text="@={stringValue}"
Android:selection="@{stringValue.length()}"
...
/>
この作品
Editable etext = edittext.getText();
Selection.setSelection(etext,edittext.getText().toString().length());
すべてのテキストを選択し、古いテキストの代わりに新しいテキストを入力するだけの場合は、次のようにします。
Android:selectAllOnFocus="true"
私がテストした他のすべてのコードは、ユーザーが文字列の途中のどこにでもキャレット/カーソルを置くことができるという事実のためにうまくいきませんでした(例:12 | 3.00 - |はカーソルです)。私の解決策は、タッチがEditTextで行われるときはいつでもカーソルを常に文字列の終わりに置きます。
究極の解決策は次のとおりです。
// For a EditText like:
<EditText
Android:id="@+id/EditTextAmount"
Android:layout_height="wrap_content"
Android:layout_width="fill_parent"
Android:hint="@string/amount"
Android:layout_weight="1"
Android:text="@string/zero_value"
Android:inputType="text|numberDecimal"
Android:maxLength="13"/>
@ string/amount = "0.00" @ string/zero_value = "0.00"
// Create a Static boolean flag
private static boolean returnNext;
// Set caret/cursor to the end on focus change
EditTextAmount.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View editText, boolean hasFocus) {
if(hasFocus){
((EditText) editText).setSelection(((EditText) editText).getText().length());
}
}
});
// Create a touch listener and put caret to the end (no matter where the user touched in the middle of the string)
EditTextAmount.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View editText, MotionEvent event) {
((EditText) editText).onTouchEvent(event);
((EditText) editText).setSelection(((EditText) editText).getText().length());
return true;
}
});
// Implement a Currency Mask with addTextChangedListener
EditTextAmount.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String input = s.toString();
String output = new String();
String buffer = new String();
String decimals = new String();
String numbers = Integer.toString(Integer.parseInt(input.replaceAll("[^0-9]", "")));
if(returnNext){
returnNext = false;
return;
}
returnNext = true;
if (numbers.equals("0")){
output += "0.00";
}
else if (numbers.length() <= 2){
output += "0." + String.format("%02d", Integer.parseInt(numbers));
}
else if(numbers.length() >= 3){
decimals = numbers.substring(numbers.length() - 2);
int commaCounter = 0;
for(int i=numbers.length()-3; i>=0; i--){
if(commaCounter == 3){
buffer += ",";
commaCounter = 0;
}
buffer += numbers.charAt(i);
commaCounter++;
}
output = new StringBuilder(buffer).reverse().toString() + "." + decimals;
}
EditTextAmount.setText(output);
EditTextAmount.setSelection(EditTextAmount.getText().length());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
/*String input = s.toString();
if(input.equals("0.0")){
EditTextAmount.setText("0.00");
EditTextAmount.setSelection(EditTextAmount.getText().length());
return;
}*/
}
@Override
public void afterTextChanged(Editable s) {
}
});
それが役に立てば幸い!
ここではeditText.setSelection
が魔法です。基本的に選択はあなたが望む任意の位置にカーソルを置くことを可能にします。
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
これにより、カーソルはEditTextの最後に移動します。基本的にeditText.getText().length()
はあなたにテキストの長さを与えます。それからsetSelection
を長さで使います。
editText.setSelection(0);
カーソルを開始位置(0)に設定するためのものです。
これでうまくいく/ 安全に :
editText.setText("");
if (!TextUtils.isEmpty(text)) {
editText.append(text);
}
@Anh Duyの答えに似ていますが、それは私にとってうまくいきませんでした。私はまた、ユーザーが編集テキストをタップしてもカーソルの位置を選択できるようになったときにのみカーソルを最後まで移動させる必要がありました。これは私にとっては有効な唯一のコードです。
boolean textFocus = false; //define somewhere globally in the class
//in onFinishInflate() or somewhere
editText.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
editText.onTouchEvent(event);
if(!textFocus) {
editText.setSelection(editText.getText().length());
textFocus = true;
}
return true;
}
});
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
textFocus = false;
}
});
etSSID.setSelection(etSSID.getText().length());
EditTextビューでテキストの末尾にカーソルを置きたい場合
EditText rename;
String title = "title_goes_here";
int counts = (int) title.length();
rename.setSelection(counts);
rename.setText(title);