EditText
पृष्ठ को लोड करते समय दो हैं , एक पाठ को पहले EditText में सेट किया गया है, इसलिए अब कर्सर प्रारंभिक स्थान पर होगा EditText
, मैं दूसरे EditText में कर्सर स्थिति सेट करना चाहता हूं जिसमें कोई डेटा नहीं है। यह कैसे करना है?
EditText
पृष्ठ को लोड करते समय दो हैं , एक पाठ को पहले EditText में सेट किया गया है, इसलिए अब कर्सर प्रारंभिक स्थान पर होगा EditText
, मैं दूसरे EditText में कर्सर स्थिति सेट करना चाहता हूं जिसमें कोई डेटा नहीं है। यह कैसे करना है?
जवाबों:
जहां स्थिति एक 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());
नीचे दिए गए कोड है शुरू करने के लिए सेट कर्सर में 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 में केवल एक ही स्थिति है, यह है setSelection(0)
।
या क्या आपका मतलब है कि EditText
जब आप अपनी गतिविधि खोलते हैं तो आप पर ध्यान केंद्रित करना चाहते हैं ? उस मामले में इसकी requestFocus()
नीचे की रेखा का उपयोग करें
e2.setSelection(e2.length());
e2
पाठ वस्तु का नाम संपादित है
EditText2 को अपना दूसरा EditText देखें। फिर कोड को onResume () में रखें।
editText2.setFocusableInTouchMode(true);
editText2.requestFocus();
या डाल दिया
<requestFocus />
दूसरे 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.setSelection()
कर्सर सेट करने के लिए उपयोग कर रहे हैं , और alertdialog
उदाहरण के लिए सेट करते समय यह काम नहीं कर रहा है , तो सुनिश्चित करें selection()
कि संवाद स्थापित करने के बाद सेट करें
उदाहरण:
AlertDialog dialog = builder.show();
input.setSelection(x,y);
यह कोड आपको अपने कर्सर को संपादन पाठ की अंतिम स्थिति में दिखाने में मदद करेगा।
editText.requestFocus();
editText.setSelection(editText.length());
मुझे सीधे सेटसेलेक्शन () विधि नहीं मिलेगी, इसलिए मैंने नीचे की तरह किया और आकर्षण की तरह काम किया
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);
यदि आप n
दाएं से बाएं ओर वर्ण के बाद कर्सर सेट करना चाहते हैं तो आपको इस तरह करना होगा।
edittext.setSelection(edittext.length()-n);
अगर edittext का टेक्स्ट पसंद है
version<sub></sub>
और आप दाएं से 6 वें स्थान पर कर्सर ले जाना चाहते हैं
फिर यह कर्सर को इस पर ले जाएगा-
version<sub> </sub>
^
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
आप अपने एडिटटेक्स्ट में स्थिति प्राप्त करने के लिए निम्न कोड का उपयोग कर सकते हैं जो एक निश्चित पंक्ति और कॉलम से मेल खाती है। फिर आप 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()
।
यदि आप EditText में कर्सर स्थिति सेट करना चाहते हैं? इन नीचे कोड की कोशिश करो
EditText rename;
String title = "title_goes_here";
int counts = (int) title.length();
rename.setSelection(counts);
rename.setText(title);
कर्सर स्थिति समस्या को हल करने के लिए कैसे करें जो कि यूएस मोबाइल (xxx) xxx- xxxx जैसे Android में स्वरूपण के बाद स्वचालित रूप से अंतिम स्थिति में आ रहा है।
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 है और इसे विश्व स्तर पर एक्सेस करें
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 के संपादन अनुभाग में कहें, Android जोड़ें: paddingLeft = "100dp" यह आपके कर्सर की शुरुआत की स्थिति को बाएं छोर से दाएं 100dp स्थानांतरित करेगा।
उसी तरह, आप android: paddingRight = "100dp" का उपयोग कर सकते हैं। यह आपके दाहिने छोर से बाईं ओर स्थित कर्सर की 100dp स्थिति को समाप्त कर देगा।
अधिक विवरण के लिए, मेरे ब्लॉग पर इस लेख को देखें : Android: EditText विजेट में कर्सर प्रारंभ और समाप्ति स्थिति सेट करना