এডিট টেক্সটে কার্সার অবস্থান কীভাবে সেট করবেন?


235

দুটি আছে EditTextপৃষ্ঠাটি লোড করার সময় প্রথম সম্পাদনা পাঠ্যে একটি পাঠ্য সেট করা হয়েছে, সুতরাং এখন কার্সারটি শুরু করার জায়গায় থাকবে EditText, আমি দ্বিতীয় সম্পাদনা পাঠ্যে কার্সার অবস্থানটি সেট করতে চাই যার কোনও তথ্য নেই। কিভাবে এই কাজ করতে?


2
আপনি এর মাধ্যাকর্ষণটিকে 'কেন্দ্র' তে সেট করতে পারেন it এটি স্বয়ংক্রিয়ভাবে কার্সারটিকে কেন্দ্রে স্থাপন করবে। আপনার পাঠ্যও তখন কেন্দ্রিক হবে।
হিরাল ভোদোড়িয়া

প্রথমত, আপনার স্বীকৃতি অনুপাত উন্নত করার চেষ্টা করুন। দ্বিতীয়ত, কার্সার অবস্থান নির্ধারণের দ্বারা আপনি কী বোঝাতে চাইছেন, যখন সম্পাদনাটিতে কোনও পাঠ্য নেই?
ভ্লাদিমির

উত্তর:


483

যেখানে অবস্থান একটি অন্তর্নিহিত:

editText1.setSelection(position)

এক্সএমএল ফাইল এ করার কোন উপায় আছে?
কিক

@ কাইক আমি এমনটি ভাবি না
আতসোহ

1
অ্যান্ড্রয়েড ব্যবহার করুন: ডেটা বাইন্ডিং সহ এক্সএমএলে নির্বাচন
মোবারক মহিদিন

96

প্রোগ্রামটিমে এডিটেক্সট এর পাঠ্য আপডেট করার পরে আমি পাঠকের শেষে কার্সার অবস্থান নির্ধারণ করার জন্য এই পদ্ধতিটি করেছি , etmsgএটি হ'ল সম্পাদনা পাঠ্য

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

4
+1 আহ! এটি এডিটেক্সট এ কার্সার অবস্থান নির্ধারণ করতে সাহায্য করেছে।
ধর্মেন্দ্র

2
এটি আমার পক্ষে কার্যকর হয়নি। আমার এডিট টেক্সটে স্প্যানিয়েবল স্ট্রিং রয়েছে। এটির জন্য কি কোনও কার্যকারিতা রয়েছে?
toobsco42

1
@ toobsco42 হ্যালো, আমি কেবল সম্পাদনা পাঠের ক্ষেত্রে স্প্যানিয়েবল স্ট্রিং ব্যবহার করার চেষ্টা করেছি .. এই পেস্টবিন .com/i02ZrNw4 দেখুন এবং এটি যেমনটি হওয়া উচিত তেমন কাজ করছে .. চেক করুন এবং তুলনা করুন
এমকেজেপ্রেখ

এক্সএমএল ফাইল থেকে এটি কি সম্ভব? @ এমকেজেপ্রেখ
যোগ গুরু

1
একই কাজটি দেখে মনে হচ্ছে:etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
স্টিভ ব্ল্যাকওয়েল

37

অ্যান্ড্রয়েড এডিটেক্সট কার্সার অবস্থান কীভাবে সেট করবেন

কোডের নীচে কার্সার সেট করা শুরু হয় 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 এ কার্সার অবস্থান নির্ধারণ করতে চাই যার কোনও ডেটা নেই

খালি এডিটেক্সটে একটি মাত্র অবস্থান আছে, এটি setSelection(0)

অথবা আপনার অর্থ কী EditTextযখন আপনি আপনার ক্রিয়াকলাপটি খোলার সময় আপনার দিকে ফোকাস পেতে চান ? সেক্ষেত্রে এর requestFocus()


সেটলেশন (0) কাজ করছে না, আমি দ্বিতীয় সম্পাদনা পাঠের দিকে ফোকাস পেতে চাই না, আমি কেবল দ্বিতীয় সম্পাদনা পাঠের মধ্যে কার্সারটি সেট করতে চাই
নীল

3
যদি আমি সঠিকভাবে মনে রাখি, যখন একটি সম্পাদনা পাঠ্য অনুরোধ ফোকাস করে, কার্সার সেট হয়ে যায়। এটি পড়ুন
রেনো


9

আসুন editText2 আপনার দ্বিতীয় editText দৃশ্য .then কোড টুকরা নিম্নলিখিত করা হয় (onResume)

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

বা করা

<requestFocus />

দ্বিতীয় সম্পাদনা পাঠের ভিউটির আপনার এক্সএমএল লেআউটে।


7

কিছু সময় সম্পাদনা করার জন্য পাঠ্য কার্সার ডোনট নির্দিষ্ট স্থানে আসে যদি আমরা সরাসরি ব্যবহার করি editText.setSelection(position);। সেক্ষেত্রে আপনি চেষ্টা করতে পারেন

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

7

আপনি যদি এডিট টেক্সটে নির্দিষ্ট অবস্থানে কার্সার রাখতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

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

এডিটেক্সট এর পাঠ্য যদি পছন্দ হয়

version<sub></sub>

এবং আপনি কার্সারটি ডান থেকে 6th ষ্ঠ অবস্থানে নিয়ে যেতে চান

তারপরে এটি কার্সারটি এটিকে সরিয়ে ফেলবে-

    version<sub> </sub>
                ^



0

একটি সারি এবং কলামে কার্সার সেট করুন

আপনি আপনার সম্পাদনা পাঠের একটি নির্দিষ্ট সারি এবং কলামের সাথে সঙ্গতিপূর্ণ অবস্থান পেতে নিম্নলিখিত কোডটি ব্যবহার করতে পারেন। তারপরে আপনি editText.setSelection(getIndexFromPos(row, column))কার্সার অবস্থান নির্ধারণ করতে ব্যবহার করতে পারেন । পদ্ধতিতে নিম্নলিখিত কলগুলি করা যেতে পারে:

  • getIndexFromPos(x, y) এক্স লাইনের কলামে যান
  • getIndexFromPos(x, -1) এক্স লাইনের শেষ কলামে যান
  • getIndexFromPos(-1, y) শেষ লাইনের y কলামে যান
  • getIndexFromPos(-1, -1) শেষ লাইনের শেষ কলামে যান

সমস্ত লাইন এবং কলাম সীমা পরিচালনা করা হয়; লাইনের দৈর্ঘ্যের চেয়ে বেশি কলাম প্রবেশ করানো লাইনের শেষ কলামে অবস্থান ফিরে আসবে। এডিট টেক্সটের লাইন গণনার চেয়ে বড় লাইন প্রবেশ করা শেষ লাইনে যাবে। এটি যথেষ্ট নির্ভরযোগ্য হওয়া উচিত কারণ এটি ভারী পরীক্ষা করা হয়েছিল।

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 rename;
 String title = "title_goes_here";
 int counts = (int) title.length();
 rename.setSelection(counts);
 rename.setText(title);

0

অ্যান্ড্রয়েডে ইউএস মোবাইলে (এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স) বিন্যাসের পরে স্বয়ংক্রিয়ভাবে শেষ অবস্থানে চলে আসা কার্সার অবস্থানের সমস্যাটি কীভাবে সমাধান করা যায় resolve

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

আমার ক্ষেত্রে যে কোনও ক্রিয়াকলাপের জন্য নীচের পদ্ধতিটি নির্ধারণ করুন ক্রিয়াকলাপের নাম অ্যাপআপিল এবং এটি বিশ্বব্যাপী অ্যাক্সেস করুন

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

আমি বিশ্বাস করি এটি করার সর্বাধিক সহজ উপায় হ'ল প্যাডিং ব্যবহার।

আপনার এক্সএমএল এর সম্পাদনা পাঠ্য বিভাগে বলুন, অ্যান্ড্রয়েড যুক্ত করুন: প্যাডিং লেফট = "100 ডিপি" এটি আপনার কর্সারের শুরু অবস্থানকে 100dp বাম প্রান্ত থেকে ডানদিকে নিয়ে যাবে।

একইভাবে, আপনি অ্যান্ড্রয়েড ব্যবহার করতে পারেন: প্যাডিংরাইট = "100 ডিপি" এটি আপনার কর্সারের শেষ অবস্থানটি ডান প্রান্ত থেকে 100dp বামে সরিয়ে ফেলবে।

আরও তথ্যের জন্য, আমার ব্লগে এই নিবন্ধটি পরীক্ষা করুন : অ্যান্ড্রয়েড: সম্পাদনা পাঠ্য উইজেটে কার্সার শুরু এবং সমাপ্তি অবস্থান নির্ধারণ করে


2
প্যাডিংয়ের কার্সার পজিশনের সাথে কোনও সম্পর্ক নেই এবং এই বিশেষ পরিস্থিতিতে এটি একটি সম্পূর্ণ ভুল চিন্তাভাবনা।
হাঙ্গর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.