මම අගය වෙනස් වෙනවා EditText
මත keyListener
.
නමුත් මම පෙළ වෙනස් කරන විට කර්සරය ආරම්භයට ගමන් කරයි EditText
. පා the යේ අවසානයේ කර්සරය අවශ්යයි.
දී එම පෙළ අගට කර්සරය ගෙන යන්නේ කෙසේද EditText
.
මම අගය වෙනස් වෙනවා EditText
මත keyListener
.
නමුත් මම පෙළ වෙනස් කරන විට කර්සරය ආරම්භයට ගමන් කරයි EditText
. පා the යේ අවසානයේ කර්සරය අවශ්යයි.
දී එම පෙළ අගට කර්සරය ගෙන යන්නේ කෙසේද EditText
.
EditText
s හි ගැටලුව a හි අයිතම ලෙස තිබුණි ListView
. අත්හදා බැලීම් සම්බන්ධයෙන් ගත් කල, මම ListView
තරමක් සංකීර්ණ තිරිසනෙකු වන ප්රභව කේතයේම යම් යම් වෙනස්කම් සිදු කර ඉමුලේටරය මත පරීක්ෂා කළෙමි . එය සං component ටකය විසින් සාදන ලද නාභිගත පාලන කළමනාකරණයට සම්බන්ධ විය. ඉතින් ඇත්ත වශයෙන්ම එය අපගේ මිතුරාට උපකාර කිරීම සඳහා මට දිය හැකි විසඳුමක් නොවේ. :)
OnFocusChanged
ඇමතුම් ලබා ගැනීමේදී මෙය ක්රියා නොකරයි . එහි ඇති විසඳුම වන්නේ setSelection ධාවනය කළ හැකි ඇතුළත තබා එය ප්රධාන නූල් මත ධාවනය කිරීමයි. මෙහි පරීක්ෂා කරන්න stackoverflow.com/a/32156989/4514796
Answers:
මේක උත්සාහ කරන්න:
EditText et = (EditText)findViewById(R.id.inbox);
et.setSelection(et.getText().length());
onSelectionChanged()
EditText
public void onSelectionChanged(int start, int end) { CharSequence text = getText(); if (text != null) { if (start != text.length() || end != text.length()) { setSelection(text.length(), text.length()); return; } } super.onSelectionChanged(start, end); }
වත්මන් සංස්කරණ පෙළ අගයට නූල් අගය එකතු කරන අතර කර්සරය අගය අවසානයේ තබන එඩිටෙක්ස්ට් සඳහා ඇපෙන්ඩ් යනුවෙන් ශ්රිතයක් ඇත. වත්මන් එඩිටෙක්ස්ට් අගය ලෙස ඔබට නූල් අගය තිබිය හැකි අතර ඇපෙන්ඩ් () අමතන්න;
myedittext.append("current_this_edittext_string");
myedittext.append("");
myedittext.append("");
කිරීම මට වැඩ කළේ නැත!
Selection
කිරීම එම IMO සාක්ෂාත් කර ගැනීම සඳහා නිවැරදි ක්රමයයි.
කොට්ලින් :
කර්සරය ආරම්භක ස්ථානයට සකසන්න :
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(0)
EditText අවසානයට කර්සරය සකසන්න :
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(editText.text.length)
පහත කේතය වන්නේ දෙවන අක්ෂරයෙන් පසුව කර්සරය තැබීමයි :
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(2)
ජාවා :
කර්සරය ආරම්භක ස්ථානයට සකසන්න :
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());
පහත කේතය වන්නේ දෙවන අක්ෂරයෙන් පසුව කර්සරය තැබීමයි :
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);
findViewById(R.id.edittext_id) as EditText
කිරීමට findViewById<EditText>(R.id.edittext_id)
හෝ වළක්වා ගත හැකියAPI 26+
ඔබ setText
කලින් ඇමතුවේ නම් සහ නව පෙළට setSelection
වෙනම ධාවනය කළ හැකි වෙඩි තැබීමකින් පිරිසැලසුම් අදියර ඇමතුමක් නොලැබුනේ නම් View.post(Runnable)
( මෙම මාතෘකාවෙන් නැවත තැපැල් කරන්න ).
ඉතින්, මට නම් මෙම කේතය ක්රියාත්මක වේ:
editText.setText("text");
editText.post(new Runnable() {
@Override
public void run() {
editText.setSelection(editText.getText().length());
}
});
සංස්කරණය 05/16/2019: දැන් මම ඒ සඳහා කොට්ලින් දිගුව භාවිතා කරමි:
fun EditText.placeCursorToEnd() {
this.setSelection(this.text.length)
}
ඉන්පසු - editText.placeCursorToEnd ().
මෙය කළ හැකි තවත් විසඳුමකි:
et.append("");
කිසියම් හේතුවක් නිසා එය ක්රියාත්මක නොවන්නේ නම් මෙම විසඳුම උත්සාහ කරන්න:
et.setSelection(et.getText().length());
/**
* Set cursor to end of text in edittext when user clicks Next on Keyboard.
*/
View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if (b) {
((EditText) view).setSelection(((EditText) view).getText().length());
}
}
};
mEditFirstName.setOnFocusChangeListener(onFocusChangeListener);
mEditLastName.setOnFocusChangeListener(onFocusChangeListener);
එය මට හොඳට වැඩ කරයි!
මගේ නඩුවේදී මම පහත කෝට්ලින් දිගුව නිර්මාණය කළෙමි. ශ්රිතය යමෙකුට ප්රයෝජනවත් විය හැකිය
private fun EditText.focus(){
requestFocus()
setSelection(length())
}
ඉන්පසු පහත පරිදි භාවිතා කරන්න
mEditText.focus()
ඔබේ EditText පැහැදිලි නැතිනම්:
editText.setText("");
editText.append("New text");
හෝ
editText.setText(null);
editText.append("New text");
මම හිතන්නේ මෙය ඔබට අවශ්ය දේ සපුරා ගත හැකිය.
Editable etext = mSubjectTextEditor.getText();
Selection.setSelection(etext, etext.length());
ප්රශ්නය පරණ සහ පිළිතුරු ඇත, නමුත් ඇන්ඩ්රොයිඩ් සඳහා අලුතින් නිකුත් කරන ලද දත්ත බන්ධන මෙවලම් භාවිතා කිරීමට ඔබට අවශ්ය නම් මෙම පිළිතුර ලබා ගැනීම ප්රයෝජනවත් යැයි මම සිතමි, මෙය ඔබේ XML හි සකසන්න:
<data>
<variable name="stringValue" type="String"/>
</data>
...
<EditText
...
android:text="@={stringValue}"
android:selection="@{stringValue.length()}"
...
/>
හෙලෝ මෙය උත්සාහ කරන්න
<EditText
android:id="@+id/edt_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World!"
android:cursorVisible="true"/>
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length()); // End point
කර්සරය
මෙය ක්රියාත්මක වේ
Editable etext = edittext.getText();
Selection.setSelection(etext,edittext.getText().toString().length());
editText.setSelection
මෙතන මැජික් එක. මූලික වශයෙන් තේරීම මඟින් ඔබට අවශ්ය ඕනෑම ස්ථානයක කර්සරය ස්ථානගත කරයි.
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
මෙය කර්ටරය EditText අවසානය දක්වා තබයි. මූලික වශයෙන් editText.getText().length()
ඔබට පෙළ දිග ලබා දෙයි. එවිට ඔබ setSelection
දිග සමඟ භාවිතා කරයි.
editText.setSelection(0);
එය ආරම්භක ස්ථානයේ (0) කර්සරය සැකසීම සඳහා ය.
මා විසින් පරීක්ෂා කරන ලද අනෙකුත් සියලුම කේතයන් ක්රියා නොකරන්නේ පරිශීලකයාට තවමත් මැදිරියේ කොතැනක හෝ කරත්තය / කර්සරය තැබිය හැකි බැවිනි (උදා: 12 | 3.00 - කොහෙද | කර්සරය). EditText හි ස්පර්ශය ඇති වූ සෑම විටම මගේ විසඳුම කර්සරය නූල් අවසානයේ තබයි.
අවසාන විසඳුම නම්:
// For a EditText like:
<EditText
android:id="@+id/EditTextAmount"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:hint="@string/amount"
android:layout_weight="1"
android:text="@string/zero_value"
android:inputType="text|numberDecimal"
android:maxLength="13"/>
@ string / amount = "0.00" @ string / zero_value = "0.00"
// Create a Static boolean flag
private static boolean returnNext;
// Set caret/cursor to the end on focus change
EditTextAmount.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View editText, boolean hasFocus) {
if(hasFocus){
((EditText) editText).setSelection(((EditText) editText).getText().length());
}
}
});
// Create a touch listener and put caret to the end (no matter where the user touched in the middle of the string)
EditTextAmount.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View editText, MotionEvent event) {
((EditText) editText).onTouchEvent(event);
((EditText) editText).setSelection(((EditText) editText).getText().length());
return true;
}
});
// Implement a Currency Mask with addTextChangedListener
EditTextAmount.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String input = s.toString();
String output = new String();
String buffer = new String();
String decimals = new String();
String numbers = Integer.toString(Integer.parseInt(input.replaceAll("[^0-9]", "")));
if(returnNext){
returnNext = false;
return;
}
returnNext = true;
if (numbers.equals("0")){
output += "0.00";
}
else if (numbers.length() <= 2){
output += "0." + String.format("%02d", Integer.parseInt(numbers));
}
else if(numbers.length() >= 3){
decimals = numbers.substring(numbers.length() - 2);
int commaCounter = 0;
for(int i=numbers.length()-3; i>=0; i--){
if(commaCounter == 3){
buffer += ",";
commaCounter = 0;
}
buffer += numbers.charAt(i);
commaCounter++;
}
output = new StringBuilder(buffer).reverse().toString() + "." + decimals;
}
EditTextAmount.setText(output);
EditTextAmount.setSelection(EditTextAmount.getText().length());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
/*String input = s.toString();
if(input.equals("0.0")){
EditTextAmount.setText("0.00");
EditTextAmount.setSelection(EditTextAmount.getText().length());
return;
}*/
}
@Override
public void afterTextChanged(Editable s) {
}
});
එය උපකාරී වේ යැයි සිතමු!
EditText
මගේ සටහන් යෙදුමේ බහුකාර්ය සහාය ඇතිව මට මෙම ක්රියාකාරීත්වය අවශ්ය විය . පරිශීලකයා සටහන් පෙළ ඇති කැබැල්ලට සැරිසැරූ විට මට පෙළ අවසානයේ කර්සරය අවශ්ය විය.
Djleop විසින් යෝජනා කරන ලද විසඳුම සමීප වේ. නමුත් මෙහි ඇති ගැටළුව නම්, පරිශීලකයා කර්සරය සංස්කරණය සඳහා පෙළ මැද කොතැනක හෝ තබා ටයිප් කිරීම ආරම්භ කළහොත් කර්සරය නැවත පෙළ අවසානයට පනින්න. මෙය සිදු වූයේ LiveData
නව අගය විමෝචනය වන අතර කර්සරය නැවත පා of යේ අවසානයට පනින නිසා පරිශීලකයාට කොතැනක හෝ පෙළ සංස්කරණය කිරීමට නොහැකි වනු ඇත.
මෙම විසඳීම සඳහා මම භාවිතා MediatorLiveData
සහ එය දිග අනුයුක්ත String
ධජ භාවිතා එක් වරක් පමණයි. මෙය LiveData අගය කියවීමට එක් වරක් පමණක් හේතු වේ, එනම් පරිශීලකයා කැබැල්ලට සැරිසැරූ විට. ඉන්පසු පරිශීලකයාට කර්සරය පෙළ සංස්කරණය කිරීමට අවශ්ය ඕනෑම තැනක තැබිය හැකිය.
ViewModel
private var accessedPosition: Boolean = false
val cursorPosition = MediatorLiveData<Event<Int>>().apply {
addSource(yourObject) { value ->
if(!accessedPosition) {
setValue(Event(yourObject.note.length))
accessedPosition = true
}
}
}
මෙන්න, yourObject
ඔබ පෙන්වන සංගීත පෙළ රඳවා ඇති දත්ත සමුදායෙන් ලබාගත් තවත් සජීවී දත්තයකි EditText
.
ඉන්පසු මෙය MediatorLiveData
බන්ධන ඇඩැප්ටරය භාවිතයෙන් ඔබේ සංස්කරණයට සම්බන්ධ කරන්න.
XML
පෙළ ප්රදර්ශනය කිරීම සඳහා මෙන්ම පෙළ ආදානය පිළිගැනීම සඳහා ද්වි-මාර්ග දත්ත බන්ධනයක් භාවිතා කරයි.
<!-- android:text must be placed before cursorPosition otherwise we'll get IndexOutOfBounds exception-->
<EditText
android:text="@={viewModel.noteText}"
cursorPosition="@{viewModel.cursorPosition}" />
බන්ධන ඇඩැප්ටරය
@BindingAdapter("cursorPosition")
fun bindCursorPosition(editText: EditText, event: Event<Int>?) {
event?.getContentIfNotHandled()?.let { editText.setSelection(it) }
}
Event
පන්තිය
මෙහි Event
පන්තිය ගූගල් වෙතින් ජෝස් ඇල්කෙරෙකා විසින් ලියන ලද සිංගල් ලයිව්එවෙන්ට් වැනි ය . තිර භ්රමණය ගැන සැලකිලිමත් වීමට මම එය මෙහි භාවිතා කරමි. තනි භාවිතා කිරීමෙන් Event
පරිශීලකයා පෙළ කොතැනක හෝ සංස්කරණය කර තිරය භ්රමණය වන විට කර්සරය පෙළ අවසානයට නොයන බවට සහතික වේ. තිරය භ්රමණය වන විට එය එකම ස්ථානයක් පවත්වා ගනී.
මෙන්න Event
පන්තිය:
open class Event<out T>(private val content: T) {
var hasBeenHandled = false
private set // Allow external read but not write
/**
* Returns the content and prevents its use again.
*/
fun getContentIfNotHandled(): T? {
return if (hasBeenHandled) {
null
} else {
hasBeenHandled = true
content
}
}
/**
* Returns the content, even if it's already been handled.
*/
fun peekContent(): T = content
}
මෙය මට වැඩ කරන සහ හොඳ පරිශීලක අත්දැකීමක් ලබා දෙන විසඳුමයි. එය ඔබගේ ව්යාපෘති සඳහා ද උපකාරී වේ යැයි සිතමු.
n ආන් ඩුයිගේ පිළිතුරට සමානය, නමුත් එය මට සාර්ථක වූයේ නැත. කර්සරය අවසානයට ගෙනයාමට අවශ්ය වූයේ පරිශීලකයා සංස්කරණ පෙළ තට්ටු කළ විටත් පසුව කර්සරයේ පිහිටීම තෝරා ගැනීමටත් හැකි වූ විට පමණි, මෙය මා වෙනුවෙන් වැඩ කළ එකම කේතයයි
boolean textFocus = false; //define somewhere globally in the class
//in onFinishInflate() or somewhere
editText.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
editText.onTouchEvent(event);
if(!textFocus) {
editText.setSelection(editText.getText().length());
textFocus = true;
}
return true;
}
});
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
textFocus = false;
}
});
මෙය උපක්රමය ආරක්ෂිතව කරයි :
editText.setText("");
if (!TextUtils.isEmpty(text)) {
editText.append(text);
}
etSSID.setSelection(etSSID.getText().length());
ඉහත පිළිතුරු මට ප්රයෝජනවත් නොවීය. එබැවින් මම නව විසඳුමක් සොයා ගතිමි. මෙය යමෙකුට ප්රයෝජනවත් විය හැකිය. මම වර්තමාන දිනය අනුව ඇන්ඩ්රොයිඩ් ස්ටුඩියෝ හි නවතම අනුවාදය එනම් 3.5 භාවිතා කර ඇත. ඉහත පිළිතුරු කිසිදු බලපෑමක් නොපෙන්වීමට හේතුව එය විය හැකිය.
කේතය:
EditText available_seats = findViewById(R.id.available_seats);
Selection.setSelection(available_seats.getText(),available_seats.getText().length());
මෙන්න, 1 වන තර්කය ඔබට සෙල්ලම් කිරීමට අවශ්ය ස්පැනබල් පෙළ අගය වන අතර 2 වන තර්කය දර්ශක අගය වේ. පා of යේ අවසානයේ අපට කර්සරය අවශ්ය බැවින්, අපි getText () දිග () ලබා ගත් අතර එය පෙළෙහි දිග ලබා දෙයි
public class CustomEditText extends EditText {
public CustomEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomEditText(Context context) {
super(context);
}
public CustomEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
this.setSelection(this.getText().length());
}
@Override
protected void onSelectionChanged(int selStart, int selEnd) {
}
}
ඔබගේ XML ගොනුවේ මෙම CustomEditText භාවිතා කරන්න, මෙය ක්රියාත්මක වේ. මම මෙය අත්හදා බලා ඇති අතර එය මට වැඩ කරයි.
ඔබට කර්සරය පෙළ අවසානයේ සංස්කරණ ටෙක්ස්ට් දර්ශනයේ තැබීමට අවශ්ය නම්
EditText rename;
String title = "title_goes_here";
int counts = (int) title.length();
rename.setSelection(counts);
rename.setText(title);