Android EditTextPreference和默认光标位置

Android EditTextPreference和默认光标位置,android,cursor,android-edittext,Android,Cursor,Android Edittext,这主要是我的一个恼怒,但它让我非常恼火,因为默认行为或EditTextPreferences是将光标放在字符串的开头。这对我来说毫无意义。在人类所知的几乎任何其他界面中(很好,我),聚焦文本字段会自动将光标发送到末尾 所以。有没有(简单的)方法来克服这个问题?我知道我可以从EditTextPreference进行扩展,并手动调用setSelection(),但对于这样一个简单的问题,这似乎是一个非常复杂的解决方案。我最终扩展了EditTextPreference并覆盖了showDialog方法:

这主要是我的一个恼怒,但它让我非常恼火,因为默认行为或
EditTextPreference
s是将光标放在字符串的开头。这对我来说毫无意义。在人类所知的几乎任何其他界面中(很好,我),聚焦文本字段会自动将光标发送到末尾


所以。有没有(简单的)方法来克服这个问题?我知道我可以从
EditTextPreference
进行扩展,并手动调用
setSelection()
,但对于这样一个简单的问题,这似乎是一个非常复杂的解决方案。

我最终扩展了
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());
      }
    });
  }

我有另一个解决办法

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

与lukeuser的解决方案类似,您可以将
OnPreferenceClickListener
inline定义为类变量:

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


关于这一点的另一个角度:我只是在XML定义中或在对象上以编程方式将“selectAllOnFocus”设置为true


它基本上实现了我想要的:让最终用户能够立即替换内容。

这为我完成了任务,只需覆盖preferencetreeclick():

请记住,我使用了PreferenceFragment,但PreferenceActivity也是如此


此解决方案改编自

Cool,但EditText在旋转时将不再保留选择/光标位置。如果您希望用户能够替换整个内容,而不仅仅是在末尾追加文本,这是最短的方法。
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;
        }
    } );
/**
 * 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;
}