2011-05-06 106 views
14

这主要是我的宠物,但它让我感到不安,默认行为或EditTextPreference s是将光标放在字符串的开头。这对我来说毫无意义。在几乎任何人们熟知的其他界面中(精细,ME),关注文本字段会自动将光标发送到END。EditTextPreference和默认光标位置

所以。有没有一种(简单)的方法来覆盖这个?我知道我可以从EditTextPreference延长并手动拨打电话setSelection(),但对于这样一个简单的问题,这似乎是一个非常复杂的解决方案。

回答

3

我结束了延长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()); 
     } 
    }); 
    } 
+0

酷适于,但的EditText不会保留在旋转选择/光标位置了。 – 2014-02-12 09:31:16

1

我得到了另一种解决方案!

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

到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; 
     } 
    }); 
9

关于此问题的另一个角度:我只是在XML定义中将“selectAllOnFocus”设置为true,或者在对象上以编程方式结束。

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

+0

如果您想让用户替换整个内容,而不仅仅是将文本附加到末尾,那么这是最短的方式。 – TDG 2017-10-06 16:07:40

1

这为我做的伎俩,只是覆盖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/