EditText में कर्सर की स्थिति कैसे सेट करें?


235

EditTextपृष्ठ को लोड करते समय दो हैं , एक पाठ को पहले EditText में सेट किया गया है, इसलिए अब कर्सर प्रारंभिक स्थान पर होगा EditText, मैं दूसरे EditText में कर्सर स्थिति सेट करना चाहता हूं जिसमें कोई डेटा नहीं है। यह कैसे करना है?


2
आप इसके गुरुत्वाकर्षण को 'केंद्र' पर सेट कर सकते हैं। यह स्वचालित रूप से कर्सर को केंद्र में स्थापित करेगा। आपका पाठ भी तब केंद्रित होगा।
हीरालाल वड़ोदरिया

सबसे पहले, अपने स्वीकार अनुपात में सुधार करने का प्रयास करें। दूसरा, कर्सर स्थिति निर्धारित करने से आपका क्या मतलब है, जब एडिटेक्स में कोई पाठ नहीं है?
व्लादिमीर

जवाबों:


483

जहां स्थिति एक int है:

editText1.setSelection(position)

XML फ़ाइल में ऐसा करने का कोई तरीका है?
केके

@ मैं ऐसा नहीं सोचता
atasoyh

1
एंड्रॉइड का उपयोग करें: डेटा बाइंडिंग के साथ xml में चयन
मुबारक मोहिदीन

96

मैंने इस तरह से EditText के पाठ को अद्यतन करने के बाद पाठ के अंत में कर्सर की स्थिति निर्धारित करने के लिए इस तरह से किया है, etmsgEditText है

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

4
+1 आह! अच्छा लगा कि मुझे एडिटस्टेक्स में कर्सर की स्थिति निर्धारित करने में मदद मिली।
धर्मेंद्र

2
इसने मेरे लिए काम नहीं किया। मेरे EditText में Spannable स्ट्रिंग्स हैं। क्या इसके लिए वर्कअराउंड है?
टॉब्स्को 42

1
@ toobsco42 नमस्कार, मैंने एडिटटेक्स्ट में स्पैनबल स्ट्रिंग का उपयोग करने की कोशिश की है .. इस pastebin.com/i02ZrNw4 को चेक करें और यह अपेक्षित रूप से काम कर रहा है .. इसकी जांच करें और तुलना करें
MKJParex

क्या यह xml फ़ाइल से संभव है? @MKJParekh
योग गुरु

1
ऐसा ही करने के लिए लगता है:etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
स्टीव ब्लैकवेल

37

Android में EditText Cursor स्थिति कैसे सेट करें

नीचे दिए गए कोड है शुरू करने के लिए सेट कर्सर में 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 में केवल एक ही स्थिति है, यह है setSelection(0)

या क्या आपका मतलब है कि EditTextजब आप अपनी गतिविधि खोलते हैं तो आप पर ध्यान केंद्रित करना चाहते हैं ? उस मामले में इसकी requestFocus()


setSelection (0) काम नहीं कर रहा है, मैं दूसरे EditText पर ध्यान केंद्रित नहीं करना चाहता, मैं केवल दूसरे EditText
nila

3
अगर मुझे सही से याद है, जब एक EditText अनुरोध करता है, तो कर्सर सेट किया जाता है। इसे पढ़ें
रेनो


9

EditText2 को अपना दूसरा EditText देखें। फिर कोड को onResume () में रखें।

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

या डाल दिया

<requestFocus />

दूसरे 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()


5

setSelection(int index)विधि Edittextआपको ऐसा करने की अनुमति देनी चाहिए।


4

एक अनुस्मारक के रूप में: यदि आप edittext.setSelection()कर्सर सेट करने के लिए उपयोग कर रहे हैं , और alertdialogउदाहरण के लिए सेट करते समय यह काम नहीं कर रहा है , तो सुनिश्चित करें selection()कि संवाद स्थापित करने के बाद सेट करें

उदाहरण:

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

3

यह कोड आपको अपने कर्सर को संपादन पाठ की अंतिम स्थिति में दिखाने में मदद करेगा।

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


1

मुझे सीधे सेटसेलेक्शन () विधि नहीं मिलेगी, इसलिए मैंने नीचे की तरह किया और आकर्षण की तरह काम किया

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>
                ^



0

कर्सर को एक पंक्ति और कॉलम पर सेट करें

आप अपने एडिटटेक्स्ट में स्थिति प्राप्त करने के लिए निम्न कोड का उपयोग कर सकते हैं जो एक निश्चित पंक्ति और कॉलम से मेल खाती है। फिर आप 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

कोटलिन में, आप इस तरह से एक एक्सटेंशन फंक्शन बना सकते हैं:

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

कर्सर स्थिति समस्या को हल करने के लिए कैसे करें जो कि यूएस मोबाइल (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);

-3

मेरा मानना ​​है कि ऐसा करने का सबसे सरल तरीका सिर्फ पैडिंग का उपयोग करना है।

अपने xml के संपादन अनुभाग में कहें, Android जोड़ें: paddingLeft = "100dp" यह आपके कर्सर की शुरुआत की स्थिति को बाएं छोर से दाएं 100dp स्थानांतरित करेगा।

उसी तरह, आप android: paddingRight = "100dp" का उपयोग कर सकते हैं। यह आपके दाहिने छोर से बाईं ओर स्थित कर्सर की 100dp स्थिति को समाप्त कर देगा।

अधिक विवरण के लिए, मेरे ब्लॉग पर इस लेख को देखें : Android: EditText विजेट में कर्सर प्रारंभ और समाप्ति स्थिति सेट करना


2
पैडिंग का कर्सर स्थिति से कोई लेना-देना नहीं है, और इस विशेष स्थिति में विचार का एक पूरी तरह से गलत स्कूल है।
शार्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.