回答:
positionがintの場合:
editText1.setSelection(position)
EditTextのテキストをプログラムで
ここで更新した後、カーソルの位置をテキストの最後に設定するこの方法をetmsg
実行しました。EditTextです。
etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);
etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
以下のコードは、カーソルを[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);
データを含まないedittextにカーソル位置を設定したい
空のEditTextには1つの位置しかありませんsetSelection(0)
。
それともEditText
、活動が始まったら自分に集中したいということですか?その場合、その requestFocus()
以下の行を使用してください
e2.setSelection(e2.length());
e2
編集テキストのオブジェクト名です
editText2が2番目のEditTextビューであるとしましょう。次に、次のコードをonResume()に入れます。
editText2.setFocusableInTouchMode(true);
editText2.requestFocus();
または置く
<requestFocus />
2番目のEditTextビューのxmlレイアウトで。
エディットテキストカーソルが特定の位置に来ないことがあるのは、直接使用する場合editText.setSelection(position);
です。その場合、あなたは試すことができます
editText.post(new Runnable() {
@Override
public void run() {
editText.setSelection(string.length());
}
});
EditTextの特定の位置にカーソルを置きたい場合は、以下を使用できます。
yourEditText.setSelection(position);
さらに、最初と最後の位置を設定して、次のようにプログラムでテキストを選択することもできます。
yourEditText.setSelection(startPosition, endPosition);
カーソルを置くことができるので、選択を設定することが難しい場合がございますのでご了承ください前または後に文字、下の画像はどのようにこの場合のインデックス作品に説明します。
したがって、テキストの最後にカーソルを置きたい場合は、単にに設定しyourEditText.length()
ます。
次のコードを使用して、特定の行と列に対応する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()
。
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);
これを行う最も簡単な方法は、パディングを使用することだと思います。
xmlのedittextセクションで、android:paddingLeft = "100dp"を追加します。これにより、カーソルの開始位置が左端から右に100 dp移動します。
同様に、android:paddingRight = "100dp"を使用できます。これにより、カーソルの終了位置が右端から左に100 dp移動します。
詳細については、こちらの記事をチェック私のブログ上:アンドロイドを:のEditTextウィジェットでの開始位置と終了カーソルの設定