Откройте EditTextPreference через код (программно) - PullRequest
10 голосов
/ 18 июня 2011

Я сделал EditTextPreference 'textPasscode' зависимым от CheckBoxPreference 'checkBoxPasscode'.Я хочу, чтобы «textPasscode» открылся, как только пользователь установит флажок. Возможно ли это?Если да, что я могу использовать в функции onSharedPreferenceChanged()?

public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    if(key.contentEquals("checkBoxPasscode")){
       // ----some method to open edit text "textPasscode" ??
    }
}

Ответы [ 2 ]

12 голосов
/ 14 ноября 2012

Эта проблема меня очень раздражала, поэтому после реализации предложения Сандора я искал лучшее решение в справочнике по Android и посмотрел то, что нашел.
EditTextPreference наследуется от DialogPreference , и у этого класса есть метод showDialog, поэтому я создал новый класс из EditTextPreference с помощью метода show, и он работает как charme.

Вот код:

public class MyEditTextPref extends EditTextPreference {
    //...constructor here....

    public void show() {
        showDialog(null);
    }
}

В моем файле settings.xml (который я использую для создания макета ActivitySettings) я добавил myEditTextPref

<package.that.contains.MyEditTextPreferences 
    android:key="myPref"
    android:title="@string/pref_title"
    android:summary="@string/pref_summary"
    android:dialogTitle="@string/dialog_title"
    android:dialogMessage="@string/dialog_message"
/>

И последнее, что я сделал, это метод onSharedPreferenceChanged в PreferenceActivity

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    if (key.equalsIgnoreCase(MY_CHECK_BOX)) {
        MyEditTextPreferences myPref = (MyEditTextPreferences) findPreference("myPref");
        myPref.show();
    }
}

ps .: на самом деле я не использую PreferenceFragment, потому что хочу совместимости с предварительными сотами, но не думаю, что этот код сильно изменится.

4 голосов
/ 18 сентября 2011

Я столкнулся с той же проблемой.Интересно, что это не распространенная проблема, поэтому в сети так мало результатов поиска.

Похоже, что невозможно вручную отобразить EditTextPreference из кода, хотя существует очевидный обходной путь.

Вы можете добиться того же внешнего вида и поведения, создав диалоговое окно с предупреждением и обработав нажатие кнопки ОК.

Это простой общий код для диалога ввода текста:

public static EditText showInputDialog(Context context, OnClickListener clickListener, String message)
{
    LayoutInflater factory = LayoutInflater.from(context);
    final View textEntryView = factory.inflate(R.layout.dialogedittext, null);              
    final EditText editText = (EditText)textEntryView.findViewById(id.dialogEditText);
    final AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder     
    .setTitle(message)
    .setView(textEntryView)
    .setPositiveButton("OK", clickListener)
    .setNegativeButton("Cancel", null).show();
    return editText;
}   

Просто передайте OnClickListener и обработайте параметры настройки там.Не забудьте установить переменную EditText для получения введенной пользователем строки ввода.

Надеюсь, это поможет сэкономить время людям, которые ищут эту проблему.

...