দুটি আছে EditText
পৃষ্ঠাটি লোড করার সময় প্রথম সম্পাদনা পাঠ্যে একটি পাঠ্য সেট করা হয়েছে, সুতরাং এখন কার্সারটি শুরু করার জায়গায় থাকবে EditText
, আমি দ্বিতীয় সম্পাদনা পাঠ্যে কার্সার অবস্থানটি সেট করতে চাই যার কোনও তথ্য নেই। কিভাবে এই কাজ করতে?
দুটি আছে EditText
পৃষ্ঠাটি লোড করার সময় প্রথম সম্পাদনা পাঠ্যে একটি পাঠ্য সেট করা হয়েছে, সুতরাং এখন কার্সারটি শুরু করার জায়গায় থাকবে EditText
, আমি দ্বিতীয় সম্পাদনা পাঠ্যে কার্সার অবস্থানটি সেট করতে চাই যার কোনও তথ্য নেই। কিভাবে এই কাজ করতে?
উত্তর:
যেখানে অবস্থান একটি অন্তর্নিহিত:
editText1.setSelection(position)
প্রোগ্রামটিমে এডিটেক্সট এর পাঠ্য আপডেট করার পরে আমি পাঠকের শেষে কার্সার অবস্থান নির্ধারণ করার জন্য এই পদ্ধতিটি করেছি
, etmsg
এটি হ'ল সম্পাদনা পাঠ্য
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 এ কার্সার অবস্থান নির্ধারণ করতে চাই যার কোনও ডেটা নেই
খালি এডিটেক্সটে একটি মাত্র অবস্থান আছে, এটি setSelection(0)
।
অথবা আপনার অর্থ কী EditText
যখন আপনি আপনার ক্রিয়াকলাপটি খোলার সময় আপনার দিকে ফোকাস পেতে চান ? সেক্ষেত্রে এর requestFocus()
নীচের লাইন ব্যবহার করুন
e2.setSelection(e2.length());
e2
অবজেক্টের নাম পাঠ্য সম্পাদনা করা
কিছু সময় সম্পাদনা করার জন্য পাঠ্য কার্সার ডোনট নির্দিষ্ট স্থানে আসে যদি আমরা সরাসরি ব্যবহার করি editText.setSelection(position);
। সেক্ষেত্রে আপনি চেষ্টা করতে পারেন
editText.post(new Runnable() {
@Override
public void run() {
editText.setSelection(string.length());
}
});
আপনি যদি এডিট টেক্সটে নির্দিষ্ট অবস্থানে কার্সার রাখতে চান তবে আপনি এটি ব্যবহার করতে পারেন:
yourEditText.setSelection(position);
অতিরিক্তভাবে, প্রাথমিক এবং চূড়ান্ত অবস্থান সেট করার সম্ভাবনা রয়েছে, যাতে আপনি প্রোগ্রামিয়ালি কিছু পাঠ্য নির্বাচন করেন, এভাবে:
yourEditText.setSelection(startPosition, endPosition);
দয়া করে নোট করুন যে নির্বাচনটি নির্ধারণ করা জটিল হতে পারে যেহেতু আপনি কোনও অক্ষরের আগে বা পরে কার্সারটি রাখতে পারেন , নীচের চিত্রটি কীভাবে সূচককে এই ক্ষেত্রে কাজ করবে তা ব্যাখ্যা করে:
সুতরাং, আপনি যদি পাঠ্যের শেষে কার্সার চান তবে এটিতে সেট করুন yourEditText.length()
।
এই কোডটি আপনাকে পাঠ্য সম্পাদনা করার শেষ অবস্থানে আপনার কার্সারটি প্রদর্শন করতে সহায়তা করবে।
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);
এডিটেক্সট এর পাঠ্য যদি পছন্দ হয়
version<sub></sub>
এবং আপনি কার্সারটি ডান থেকে 6th ষ্ঠ অবস্থানে নিয়ে যেতে চান
তারপরে এটি কার্সারটি এটিকে সরিয়ে ফেলবে-
version<sub> </sub>
^
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
আপনি আপনার সম্পাদনা পাঠের একটি নির্দিষ্ট সারি এবং কলামের সাথে সঙ্গতিপূর্ণ অবস্থান পেতে নিম্নলিখিত কোডটি ব্যবহার করতে পারেন। তারপরে আপনি 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()
।
আপনি সম্পাদনা পাঠ্য কার্সার অবস্থান সেট করতে চান? কোড নীচে এই চেষ্টা করুন
EditText rename;
String title = "title_goes_here";
int counts = (int) title.length();
rename.setSelection(counts);
rename.setText(title);
অ্যান্ড্রয়েডে ইউএস মোবাইলে (এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স) বিন্যাসের পরে স্বয়ংক্রিয়ভাবে শেষ অবস্থানে চলে আসা কার্সার অবস্থানের সমস্যাটি কীভাবে সমাধান করা যায় 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);
আমি বিশ্বাস করি এটি করার সর্বাধিক সহজ উপায় হ'ল প্যাডিং ব্যবহার।
আপনার এক্সএমএল এর সম্পাদনা পাঠ্য বিভাগে বলুন, অ্যান্ড্রয়েড যুক্ত করুন: প্যাডিং লেফট = "100 ডিপি" এটি আপনার কর্সারের শুরু অবস্থানকে 100dp বাম প্রান্ত থেকে ডানদিকে নিয়ে যাবে।
একইভাবে, আপনি অ্যান্ড্রয়েড ব্যবহার করতে পারেন: প্যাডিংরাইট = "100 ডিপি" এটি আপনার কর্সারের শেষ অবস্থানটি ডান প্রান্ত থেকে 100dp বামে সরিয়ে ফেলবে।
আরও তথ্যের জন্য, আমার ব্লগে এই নিবন্ধটি পরীক্ষা করুন : অ্যান্ড্রয়েড: সম্পাদনা পাঠ্য উইজেটে কার্সার শুরু এবং সমাপ্তি অবস্থান নির্ধারণ করে