Как мне программно добавить EditTextPreferences в мой PreferenceFragment?

Я новичок в Android, поэтому мне нужно небольшое руководство о том, как программно добавлять объекты EditTextPreference в мой PreferenceFragment.

Я получаю список значений из веб-службы. Я успешно сохранил их в своих SharedPreferences и использую их для создания URL-адресов (часть пути).

Я бы хотел, чтобы пользователи моего приложения могли редактировать эти значения, но после долгих поисков в Google мне не ясно, как программно добавить EditTextPreference объекты в мой PreferenceFragment.

Обратите внимание, что мой PreferenceFragment отлично работает для значений SharedPreferences, которые я жестко закодировал как имена в XML-файл настроек (PreferenceScreen). Я также знаю, как получить свои SharedPreferences, так что не беспокойтесь о том, чтобы объяснять мне эту часть.

Я использую addPreferencesFromResource в onCreate моего PreferenceFragment. Должен ли я добавить их в onCreateView? Я думал, что могу получить PreferenceCategory и добавить их туда? Но опять же, я не уверен, как это сделать. Буду очень благодарен за помощь!

// Код

PrefsFragment.java:
package com.example.lorddoineedhelp;

import android.os.Bundle;
import android.preference.PreferenceFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

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

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = super.onCreateView(inflater, container, savedInstanceState); 
    // I am guessing I need to do something here?
    return v;
  }
}

XML-файл для PreferenceFragment:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
  <!-- Hard coded values -->
  <PreferenceCategory
          android:title="General">
    <CheckBoxPreference
            android:key="debug"
            android:title="Debug"
            android:summary="Enable Debug" />
  </PreferenceCategory>
  <PreferenceCategory android:title="Address">
    <EditTextPreference 
        android:key="ipAddress"
        android:title="IP Address"
        android:summary="IP Address used for Image pings"
    />
    <EditTextPreference
          android:key="port"
          android:title="Port"
          android:summary="Port used for Image pings" />
  </PreferenceCategory>

  <!-- Where I want to add the values from my web service -->

   <PreferenceCategory 
       android:title="Paths"
       android:key="urlPaths">
  </PreferenceCategory>
</PreferenceScreen>

person codingjeremy    schedule 22.06.2013    source источник


Ответы (3)


Вы можете добавить предпочтения, например. EditTextPreference, CheckBox и т. д. программно в методе onCreate PreferenceFragment.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Load "dummy" (empty) preferences from an XML resource
    addPreferencesFromResource(R.xml.preferences_channelconfig);

    PreferenceScreen screen = this.getPreferenceScreen(); // "null". See onViewCreated.

    // Create the Preferences Manually - so that the key can be set programatically.
    PreferenceCategory category = new PreferenceCategory(screen.getContext());
    category.setTitle("Channel Configuration");
    screen.addPreference(category);

    CheckBoxPreference checkBoxPref = new CheckBoxPreference(screen.getContext());
    checkBoxPref.setKey(channelConfig.getName() + "_ENABLED");
    checkBoxPref.setTitle(channelConfig.getShortname() + "Enabled");
    checkBoxPref.setSummary(channelConfig.getDescription());
    checkBoxPref.setChecked(channelConfig.isEnabled());

    category.addPreference(checkBoxPref);
}

Важнейшим шагом является addPreferencesFromResource(...) с фиктивным xml для прикрепления пустого PreferenceScreen к фрагменту. Без этого не существует «предпочтения верхнего уровня, являющегося корнем иерархии предпочтений», поэтому this.getPreferenceScreen() возвращает Null.

XML, который я использовал, был просто:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    android:orderingFromXml="true">

</PreferenceScreen>

Надеюсь, это поможет кому-то.

person Paul Smith Racing    schedule 22.04.2015
comment
Это хорошо работает для предпочтений без xml. На самом деле нет необходимости в фиктивном XML, вместо этого можно использовать это: PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getActivity()); установитьPreferenceScreen(экран); - person kat; 13.05.2015

Вот код для программного создания PreferenceFragment:

public class MyPreferenceFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getActivity());
        setPreferenceScreen(screen);

        EditTextPreference preference = new EditTextPreference(screen.getContext());
        preference.setKey("EditTextPreference");
        preference.setTitle("Edit Text Preference");
        preference.setSummary("Click the preference to edit text.");
        screen.addPreference(preference);
    }
}
person jqgsninimo    schedule 24.09.2018

Я не знаю, работает ли это в методе onCreateView, но работает в onViewCreated. Вот мой код (внутри подкласса PreferenceFragment):

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    this.getPreferenceScreen().addPreference(new EditTextPreference(getActivity()));
}
person user2761665    schedule 10.10.2013