Я пытаюсь использовать элемент 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();
}
What am I doing incorectly?
Вы используете не созданный объект.How can I fix it up?
Найдите его и создайте экземпляр перед использованием. - person Phantômaxx   schedule 10.08.2016newInstance
вызывает статический метод, который возвращаетnew PreferencesFragment()
. Не уверен, что это изменит. - person OneCricketeer   schedule 10.08.2016getFragmentManager
вместоgetSupportFragmentManager
- person Phantômaxx   schedule 10.08.2016all fragments-related things are implemented without using support library
Как только вы используете библиотеку поддержки в своем проекте, вы не решаете, какие части вашего приложения находятся под ее контролем. Используйте это или нет. Вы не можете смешивать поддержку и отсутствие поддержки. - person Phantômaxx   schedule 10.08.2016PreferenceFragment
наAndroid.support.v14.preference.PreferenceFragment
, а в файле settings.xml я изменил наandroid.support.v7.preference.PreferenceScreen
иandroid.support.v7.preference.ListPreference
, но все равно получаю ту же ошибку. Я должен признаться, что сейчас я действительно сбит с толку - person michalsol   schedule 10.08.2016getSupportFragmentManager
? - person Phantômaxx   schedule 10.08.2016getFragmentManager
, потому чтоAndroid.support.v14.preference.PreferenceFragment
все еще расширяетFragment
отandroid.app
, а не отandroid.support.v4
, поэтому я не могу использоватьgetSupportFragmentManager
. BTW: Спасибо за попытку помочь! Я действительно впечатлен твоим упрямством. - person michalsol   schedule 10.08.2016PreferenceFragmentCompat
, все работает нормально (фрагмент отображается и не вызывает ошибок при нажатии на PrefenceList). Но это также означает, что я должен использоватьgetSupportFragmentManager
и, следовательно,android.support.v4
в каждом фрагменте. Моя minSdkVersion равна 15, действительно ли мне нужно использоватьandroid.support.v4.Fragments
? - person michalsol   schedule 10.08.2016SwipeRefreshLayout
, который недоступен без библиотек поддержки). Я не могу понять, почему мое решение, представленное в вопросе, не сработало. Что здесь меняет использование опорных фрагментов? - person michalsol   schedule 10.08.2016