EditTextPreference и позиция курсора по умолчанию

Это, в основном, мой любимый мозоль, но мне не досадно, что по умолчанию или EditTextPreference стоит поставить курсор в начало строки. Это не имеет никакого смысла для меня. Почти в любом другом интерфейсе, известном человеку (отлично, ME), фокусировка на текстовом поле автоматически отправляет курсор в конец.

Итак. Есть ли (простой) способ переопределить это? Я знаю, что могу продлевать с EditTextPreference и вызывать setSelection() вручную, но это кажется очень сложным решением для такой простой проблемы.

Ответ 1

Я закончил расширение EditTextPreference и переопределив метод showDialog:

  @Override
  protected void showDialog(Bundle state) {
    super.showDialog(state);
    Handler delayedRun = new Handler();
    delayedRun.post(new Runnable() {
      @Override
      public void run() {
        EditText textBox = getEditText();
        textBox.setSelection(textBox.getText().length());
      }
    });
  }

Ответ 2

Еще один поворот на этом: я просто завершаю настройку "selectAllOnFocus" на true либо в определении XML, либо программно на объекте.

В основном он выполнил то, что я хотел: чтобы конечный пользователь мог немедленно заменить содержимое.

Ответ 3

Как и решение lukeuser, вы можете определить встроенную строку OnPreferenceClickListener или как переменную класса:

final OnPreferenceClickListener _moveCursorToEndClickListener =
    new OnPreferenceClickListener()
    {
        @Override
        public boolean onPreferenceClick(Preference preference)
        {
            EditTextPreference editPref = (EditTextPreference)preference;
            editPref.getEditText().setSelection( editPref.getText().length() );
            return true;
        }
    };

[...]

EditTextPreference myPref = (EditTextPreference)findPreference( "MyPref" );
myPref.setOnPreferenceClickListener( _moveCursorToEndClickListener );

или

EditTextPreference myPref = (EditTextPreference)findPreference( "MyPref" );
myPref.setOnPreferenceClickListener(
    new OnPreferenceClickListener()
    {
        @Override
        public boolean onPreferenceClick(Preference preference)
        {
            EditTextPreference editPref = (EditTextPreference)preference;
            editPref.getEditText().setSelection( editPref.getText().length() );
            return true;
        }
    } );

Ответ 4

У меня есть другое решение!

class opcl implements OnPreferenceClickListener{
    @Override
    public boolean onPreferenceClick(Preference pref) {
        EditTextPreference et = (EditTextPreference) pref;
        et.getEditText().setSelection(et.getText().length());
        return true;
    }
}

Затем это для всех ваших EditTextPreferences

opcl mopcl = new opcl();
    etpref1.setOnPreferenceClickListener(mopcl);
    etpref2.setOnPreferenceClickListener(mopcl);
    etpref3.setOnPreferenceClickListener(mopcl);

Ответ 5

Это сделало трюк для меня, просто переопределите onPreferenceTreeClick():

/**
 * Automatically sets cursor to the last position in EditTextPreference
 *
 * @param preferenceScreen The {@link PreferenceScreen} that the
 *        preference is located in.
 * @param preference The preference that was clicked.
 * @return Whether the click was handled.
 */
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, @NotNull Preference preference) {
    super.onPreferenceTreeClick(preferenceScreen, preference);

    Preference clickedPreference = findPreference (preference.getKey ());
    if (clickedPreference instanceof EditTextPreference) // check if EditTextPreference
    {
        Editable editable = ((EditTextPreference) clickedPreference).getEditText().getText();
        Selection.setSelection(editable, editable.length()) ; // set the cursor to last position
        return true;
    }
    return false;
}

Имейте в виду, что я использовал PreferenceFragment, но он одинаковый для PreferenceActivity.

Это решение адаптировано из http://www.phonesdevelopers.com/1816051/