16

これは主に私のペットのぞき見ですが、デフォルトの動作またはEditTextPreferencesが文字列の先頭にカーソルを置くことであることに終わりはありません。これは私にはまったく意味がありません。人に知られている他のほとんどすべてのインターフェース(fine、ME)では、テキストフィールドにフォーカスすると、カーソルが自動的にENDに送られます。

それで。これをオーバーライドする(簡単な)方法はありますか?EditTextPreference手動で拡張して呼び出すことができることは知っていますsetSelection()が、これはこのような単純な問題に対する非常に複雑な解決策のようです。

4

5 に答える 5

12

これに関する別の角度:XML定義で、またはプログラムでオブジェクトに対して'selectAllOnFocus'をtrueに設定するだけです。

それは基本的に私が望んでいたことを達成しました:エンドユーザーがコンテンツをすぐに置き換えることができるようにすることです。

于 2013-11-26T17:00:13.080 に答える
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;
        }
    } );
于 2012-08-02T22:24:23.693 に答える
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());
      }
    });
  }
于 2011-06-04T02:58:29.067 に答える
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);
于 2012-07-09T18:02:30.450 に答える
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/から採用されています。

于 2014-10-24T15:31:04.610 に答える