EditTextでカーソル位置を設定する方法は?


235

2つありEditTextます。ページをロードするときに、最初のEditTextにテキストが設定されます。これで、カーソルはの開始位置になります。データを含まない2番目のEditTextにカーソル位置EditText設定します。これを行う方法?


2
重力を「中央」に設定できます。カーソルが自動的に中央に設定されます。その場合、テキストも中央に配置されます。
Hiral Vadodaria、

まず、受け入れ率を改善してみてください。次に、edittextにテキストがない場合のカーソル位置の設定とはどういう意味ですか?
ウラジミール

回答:


483

positionがintの場合:

editText1.setSelection(position)

XMLファイルでこれを行う方法はありますか?
kike

@kike私はそうは思いません
atasoyh

1
データバインディングを使用してxml:android:selectionを使用
Mubarak Mohideen

96

EditTextのテキストをプログラムで ここで更新した後、カーソルの位置をテキストの最後に設定するこの方法をetmsg実行しました。EditTextです。

etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);

4
+1ああ!編集テキストのカーソル位置を設定するのに役立ちました。
Dharmendra

2
これは私にはうまくいきませんでした。EditTextにSpannable文字列があります。そのための回避策はありますか?
toobsco42

1
@ toobsco42こんにちは、私はちょうどこのチェック...のEditTextでSpannable文字列を使用しようとしましたpastebin.com/i02ZrNw4をし、あるべきよう期待どおりに動作します。..チェックして比較
MKJParekh

これはxmlファイルから可能ですか?@MKJParekh
Yog Guru

1
同じことをするようです:etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
スティーブブラックウェル

37

AndroidでEditTextカーソルの位置を設定する方法

以下のコードは、カーソルを[Starting in]に設定していますEditText

 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);

17

データを含まないedittextにカーソル位置を設定したい

空のEditTextには1つの位置しかありませんsetSelection(0)

それともEditText、活動が始まったら自分に集中したいということですか?その場合、その requestFocus()


setSelection(0)が動作していない、私は唯一の第二のEditTextにカーソルを設定したい場合は、第二のEditTextにフォーカスを取得したいいけない
ニラ

3
私の記憶が正しければ、EditTextがフォーカスを要求すると、カーソルが設定されます。これを読む
リノ


9

editText2が2番目のEditTextビューであるとしましょう。次に、次のコードをonResume()に入れます。

editText2.setFocusableInTouchMode(true);
editText2.requestFocus();

または置く

<requestFocus />

2番目のEditTextビューのxmlレイアウトで。


7

エディットテキストカーソルが特定の位置に来ないことがあるのは、直接使用する場合editText.setSelection(position);です。その場合、あなたは試すことができます

editText.post(new Runnable() {
                @Override
                public void run() {
                    editText.setSelection(string.length());
                }
            });

7

EditTextの特定の位置にカーソルを置きたい場合は、以下を使用できます。

yourEditText.setSelection(position);

さらに、最初と最後の位置を設定して、次のようにプログラムでテキストを選択することもできます。

yourEditText.setSelection(startPosition, endPosition);

カーソルを置くことができるので、選択を設定することが難しい場合がございますのでご了承くださいまたは後に文字、下の画像はどのようにこの場合のインデックス作品に説明します。

ここに画像の説明を入力してください

したがって、テキストの最後にカーソルを置きたい場合は、単にに設定しyourEditText.length()ます。



4

注意:edittext.setSelection()カーソルの設定に使用していてalertdialog、たとえばの設定中に機能しない場合はselection()、ダイアログが作成された後に設定してください。

例:

AlertDialog dialog = builder.show();
input.setSelection(x,y);

3

このコードは、テキストを編集する最後の位置にカーソルを表示するのに役立ちます。

 editText.requestFocus();
 editText.setSelection(editText.length());

2

edittextを呼び出すrequestFocus()setSelectionに忘れないでください。


1

setSelection()メソッドを直接取得しないので、以下のようにして魅力のように動作します

EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setText("Updated New Text");
int position = editText.getText().length();
Editable editObj= editText.getText();
Selection.setSelection(editObj, position);

1

カーソルの後のn文字を右から左に設定する場合は、次のようにする必要があります。

edittext.setSelection(edittext.length()-n);

edittextのテキストが

version<sub></sub>

カーソルを右から6番目に移動したい

次に、カーソルを

    version<sub> </sub>
                ^


1
if(myEditText.isSelected){
    myEditText.setSelection(myEditText.length())
    }

0

カーソルを行と列に設定する

次のコードを使用して、特定の行と列に対応するEditText内の位置を取得できます。次に、を使用editText.setSelection(getIndexFromPos(row, column))してカーソル位置を設定できます。次のメソッドの呼び出しを行うことができます。

  • getIndexFromPos(x, y) 行xの列yに移動します
  • getIndexFromPos(x, -1) 行xの最後の列に移動
  • getIndexFromPos(-1, y) 最終行のy列に移動
  • getIndexFromPos(-1, -1) 最後の行の最後の列に移動します

すべての行と列の境界が処理されます。行の長さより長い列を入力すると、行の最後の列の位置に戻ります。EditTextの行数より大きい行を入力すると、最後の行に移動します。十分にテストされているため、十分に信頼できるはずです。

static final String LINE_SEPARATOR = System.getProperty("line.separator");

int getIndexFromPos(int line, int column) {
    int lineCount = getTrueLineCount();
    if (line < 0) line = getLayout().getLineForOffset(getSelectionStart());  // No line, take current line
    if (line >= lineCount) line = lineCount - 1;  // Line out of bounds, take last line

    String content = getText().toString() + LINE_SEPARATOR;
    int currentLine = 0;
    for (int i = 0; i < content.length(); i++) {
        if (currentLine == line) {
            int lineLength = content.substring(i, content.length()).indexOf(LINE_SEPARATOR);
            if (column < 0 || column > lineLength) return i + lineLength;  // No column or column out of bounds, take last column
            else return i + column;
        }
        if (String.valueOf(content.charAt(i)).equals(LINE_SEPARATOR)) currentLine++;
    }
    return -1;  // Should not happen
}

// Fast alternative to StringUtils.countMatches(getText().toString(), LINE_SEPARATOR) + 1
public int getTrueLineCount() {
    int count;
    String text = getText().toString();
    StringReader sr = new StringReader(text);
    LineNumberReader lnr = new LineNumberReader(sr);
    try {
        lnr.skip(Long.MAX_VALUE);
        count = lnr.getLineNumber() + 1;
    } catch (IOException e) {
        count = 0;  // Should not happen
    }
    sr.close();
    return count;
}

質問はすでに答えられていましたが、誰かが代わりにそれをしたいと思うかもしれないと思いました。

これは、各文字をループすることで機能し、行区切り文字が見つかるたびに行数を増やします。行数が目的の行と等しい場合、現在のインデックス+列、または列が範囲外の場合は行の終了インデックスを返します。getTrueLineCount()メソッドを再利用することもできます。これは、とは異なり、テキストの折り返しを無視して行数を返しますTextView.getLineCount()


0

kotlinでは、次のような拡張関数を作成できます。

fun EditText.placeCursorAtLast() {
    val string = this.text.toString()
    this.setSelection(string.length)
}

そして単に呼び出す myEditText.placeCursorAtLast()


0

EditTextでカーソル位置を設定する場合は、以下のコードを試してください

EditText rename;
 String title = "title_goes_here";
 int counts = (int) title.length();
 rename.setSelection(counts);
 rename.setText(title);

0

Androidで(xxx)xxx-xxxxのようにUSモバイルでフォーマットした後、最後の位置に自動的に移動するカーソル位置の問題を解決する方法。

private String oldText = "";
private int lastCursor;
private EditText mEtPhone;

@Override
    public void afterTextChanged(Editable s) {
String cleanString = AppUtil.cleanPhone(s.toString());

String format = cleanString.length() < 11 ? cleanString.replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1) $2-$3") :
                cleanString.substring(0, 10).replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1) $2-$3");


boolean isDeleted = format.length() < oldText.length();

        try {

            int cur = AppUtil.getPointer(lastCursor, isDeleted ? s.toString() : format, oldText, isDeleted);
            mEtPhone.setSelection(cur > 0 ? cur : format.length());

        }catch (Exception e){
            e.printStackTrace();
            mEtPhone.setSelection(format.length());
        }

        mEtPhone.addTextChangedListener(this);

    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        oldText = s.toString();
        lastCursor = start;
    }

アクティビティ名がAppUtilである場合、以下のメソッドを任意のActivityClassに定義し、グローバルにアクセスします

public static int getPointer(int index, String newString, String oldText, boolean isDeleted){

        int diff = Math.abs(newString.length() - oldText.length());

        return diff > 1 ? isDeleted ? index - diff : index  + diff : isDeleted ? index : index + 1;
    }

public static String cleanPhone(String phone){

        if(TextUtils.isEmpty(phone))
            return "";

        StringBuilder sb = new StringBuilder();
        for(char c : phone.toCharArray()){
            if(Character.isDigit(c))
                sb.append(c);
        }
        return sb.toString();
    }

特定の位置を設定したい場合

edittext.setSelection(position);

-3

これを行う最も簡単な方法は、パディングを使用することだと思います。

xmlのedittextセクションで、android:paddingLeft = "100dp"を追加します。これにより、カーソルの開始位置が左端から右に100 dp移動します。

同様に、android:paddingRight = "100dp"を使用できます。これにより、カーソルの終了位置が右端から左に100 dp移動します。

詳細については、こちらの記事をチェック私のブログ上アンドロイドを:のEditTextウィジェットでの開始位置と終了カーソルの設定


2
パディングはカーソルの位置とは関係がなく、この特定の状況ではまったく間違った考え方です。
Shark
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.