Невозможно щелкнуть диалоговое окно ListPreference в PreferenceFragment

Я пытаюсь использовать элемент ListPreference во фрагменте.
У меня есть следующий фрагмент:

public class PreferencesFragment extends PreferenceFragment
{

    public PreferencesFragment() {
    }


    public static PreferencesFragment newInstance() {
        PreferencesFragment fragment = new PreferencesFragment();
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
    }

}

Мой файл settings.xml выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>

<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <ListPreference
        android:title="Test"
        android:key="list_contacts"
        android:defaultValue="0"
        android:entries="@array/list_entries"
        android:entryValues="@array/list_values"/>
</PreferenceScreen>

и мой arrays.xml выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="list_entries">
        <item>Item1</item>
        <item>Item2</item>
        <item>Item3</item>
    </string-array>

    <string-array name="list_values">
        <item>0</item>
        <item>1</item>
        <item>2</item>
    </string-array>
</resources>

Я присоединяю этот PreferencesFragment к своей MainActivity.
Он отображается, но когда я нажимаю на этот элемент, диалоговое окно со списком элементов не появляется.

Вместо этого я получаю следующий вывод ошибки:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
 at com.android.internal.app.AlertController.setupView(AlertController.java:472)
 at com.android.internal.app.AlertController.installContent(AlertController.java:237)
 at android.app.AlertDialog.onCreate(AlertDialog.java:423)
 at android.app.Dialog.dispatchOnCreate(Dialog.java:389)
 at android.app.Dialog.show(Dialog.java:293)
 at android.preference.DialogPreference.showDialog(DialogPreference.java:319)
 at android.preference.DialogPreference.onClick(DialogPreference.java:277)
 at android.preference.Preference.performClick(Preference.java:994)
 at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:214)
 at android.widget.AdapterView.performItemClick(AdapterView.java:310)
 at android.widget.AbsListView.performItemClick(AbsListView.java:1155)
 at android.widget.AbsListView$PerformClick.run(AbsListView.java:3126)
 at android.widget.AbsListView$3.run(AbsListView.java:4041)
 at android.os.Handler.handleCallback(Handler.java:751)
 at android.os.Handler.dispatchMessage(Handler.java:95)
 at android.os.Looper.loop(Looper.java:154)
 at android.app.ActivityThread.main(ActivityThread.java:6077)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

и приложения останавливаются.

Что я делаю неправильно? Как я могу это исправить?

Я уже просмотрел все темы здесь, но ничего не получилось и больше ничего не приходит в голову.

EDIT: Мое переключение фрагментов в Activity довольно сложное, но в целом это примерно так:

private void navigatePreferences() {
    preferencesFragment = PreferencesFragment.newInstance();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.mainFragmentPlace, preferencesFragment);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.addToBackStack(null);
    ft.commit();
}

person michalsol    schedule 10.08.2016    source источник
comment
What am I doing incorectly? Вы используете не созданный объект. How can I fix it up? Найдите его и создайте экземпляр перед использованием.   -  person Phantômaxx    schedule 10.08.2016
comment
@HardikParmar, что вы имеете в виду под «у меня есть магазин на месте»? Я не понимаю этот вопрос.   -  person michalsol    schedule 10.08.2016
comment
@Rotwang, да, я знаю, что где-то во время метода showDialog представление равно нулю, но я понятия не имею, почему это так. Есть ли у вас какие-либо советы?   -  person michalsol    schedule 10.08.2016
comment
newInstance вызывает статический метод, который возвращает new PreferencesFragment(). Не уверен, что это изменит.   -  person OneCricketeer    schedule 10.08.2016
comment
@Rotwang, нет, не помогло. Я получаю ту же ошибку. (Я даже проверил это, прежде чем задать вопрос :))   -  person michalsol    schedule 10.08.2016
comment
Вы не используете библиотеку поддержки, верно? Я спрашиваю, потому что вы используете getFragmentManager вместо getSupportFragmentManager   -  person Phantômaxx    schedule 10.08.2016
comment
@Rotwang, я использую библиотеку поддержки для некоторых вещей (например, SwipeToRefresh или ActionBar), но все вещи, связанные с фрагментами, реализованы без использования библиотеки поддержки.   -  person michalsol    schedule 10.08.2016
comment
Действительно? тогда, я думаю, у нас есть виновник. all fragments-related things are implemented without using support library Как только вы используете библиотеку поддержки в своем проекте, вы не решаете, какие части вашего приложения находятся под ее контролем. Используйте это или нет. Вы не можете смешивать поддержку и отсутствие поддержки.   -  person Phantômaxx    schedule 10.08.2016
comment
@Rotwang, что ты имеешь в виду? Должен ли я использовать библиотеку поддержки? PreferenceFragment расширяет фрагмент из android.app, а не из android.support.v4, как я могу использовать для этого библиотеку поддержки?   -  person michalsol    schedule 10.08.2016
comment
@Rotwang, хорошо, я изменил PreferenceFragment на Android.support.v14.preference.PreferenceFragment, а в файле settings.xml я изменил на android.support.v7.preference.PreferenceScreen и android.support.v7.preference.ListPreference, но все равно получаю ту же ошибку. Я должен признаться, что сейчас я действительно сбит с толку   -  person michalsol    schedule 10.08.2016
comment
Вы сейчас используете getSupportFragmentManager?   -  person Phantômaxx    schedule 10.08.2016
comment
@Rotwang, нет, я все еще использую getFragmentManager, потому что Android.support.v14.preference.PreferenceFragment все еще расширяет Fragment от android.app, а не от android.support.v4, поэтому я не могу использовать getSupportFragmentManager. BTW: Спасибо за попытку помочь! Я действительно впечатлен твоим упрямством.   -  person michalsol    schedule 10.08.2016
comment
Профессиональная деформация... ;)   -  person Phantômaxx    schedule 10.08.2016
comment
Кстати, комментарий Даниэля Ньюджента к этому посту кажется многообещающим. stackoverflow.com/ вопросы/36145647/.   -  person Phantômaxx    schedule 10.08.2016
comment
@Rotwang, когда я переключился на PreferenceFragmentCompat, все работает нормально (фрагмент отображается и не вызывает ошибок при нажатии на PrefenceList). Но это также означает, что я должен использовать getSupportFragmentManager и, следовательно, android.support.v4 в каждом фрагменте. Моя minSdkVersion равна 15, действительно ли мне нужно использовать android.support.v4.Fragments?   -  person michalsol    schedule 10.08.2016
comment
В зависимости от того, какая у вас targetSdkVersion, вам может вообще не понадобиться поддержка. Если вам нужно использовать его, то он для всех вашего приложения. Это такая большая забота?   -  person Phantômaxx    schedule 10.08.2016
comment
@Rotwang, но вы видите, что без поддержки Fragments я не могу заставить PreferenceFragment работать. Я, очевидно, не могу полностью отказаться от библиотек поддержки (например, из-за SwipeRefreshLayout, который недоступен без библиотек поддержки). Я не могу понять, почему мое решение, представленное в вопросе, не сработало. Что здесь меняет использование опорных фрагментов?   -  person michalsol    schedule 10.08.2016
comment
После того, как вы используете библиотеку поддержки, вы должны использовать ее во всех своих приложениях. Он просто добавляет недостающие функции к более старым уровням API. Таким образом, вы можете не поддерживать старые устройства ИЛИ не использовать новейшие функции. Но я не понимаю, почему бы тебе не уйти в отставку, чтобы воспользоваться поддержкой. Это ни в коем случае не вредно. И, самое главное, ваше приложение теперь работает.   -  person Phantômaxx    schedule 10.08.2016
comment
@Rotwang Каких функций мне не хватает в API 15+, чтобы использовать фрагменты поддержки? Почему вы говорите, что я должен использовать вспомогательные библиотеки везде, если я использовал их только один раз? Я не слышал этого раньше. Насколько я знаю, мы должны использовать библиотеки поддержки только там, где мы ограничены нашим уровнем API. Но в этом случае все классы доступны на моем уровне API, но он все равно не работает. Почему? :) У меня действительно нет проблем с использованием вспомогательных библиотек, но теперь я просто не понимаю, почему мои настройки не работают без этого.   -  person michalsol    schedule 11.08.2016
comment
Я не знаю, какой у вас targetSdk, и какие новые функции вы используете, которых изначально нет в старых API. Вы можете попробовать понизить TARGET sdk и посмотреть, сможете ли вы избавиться от поддержки, если она вас действительно беспокоит. В моем случае я даже не делаю из этого проблемы, просто пользуюсь поддержкой и живу с ней счастливо.   -  person Phantômaxx    schedule 11.08.2016