Откройте EditTextPreference с помощью кода (программно)

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

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

Thanx

Ответ 1

Эта проблема была очень раздражающей для меня, поэтому, после внедрения предложения Sandor, я искал лучшее решение в Android Reference и посмотрел, что я нашел.
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, потому что мне нужна совместимость с сотами, но я не думаю, что этот код сильно изменится.

Ответ 2

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

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

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

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

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, чтобы получить введенную строку ввода.

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