Как начать preferenceActivity частично вниз по иерархии - PullRequest
0 голосов
/ 06 октября 2011

Я работаю на уровне API 9, поэтому не могу использовать новый материал Preference Fragment.

У меня есть действие по настройке, получение настроек и файла xml согласно демоверсиям API. У меня есть иерархия экранов предпочтений, поэтому обычно, чтобы перейти к предпочтениям, вы должны щелкнуть через экран верхнего уровня.

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

Кто-нибудь знает, возможно ли это? Я бы подумал, что передача некоторых данных с намерением будет способом, но я не могу найти ничего, говорящего, что это возможно.

Ответы [ 2 ]

1 голос
/ 07 октября 2011

Хорошо, вот что я закончил с помощью Куртиса.

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

// all preferences
Intent launchPreferencesIntent = new Intent().setClass(this,
    PreferencesFromXml.class);
startActivity(launchPreferencesIntent);

// just key_trip_plot_control_preferences
Intent launchPreferencesIntent = new Intent(
    getString(R.string.key_trip_plot_control_preferences))
    .setClass(this, PreferencesFromXml.class);
startActivity(launchPreferencesIntent);

В моем классе PreferencesFromXml я всегда добавляю предпочтения из xml, но затем, если у меня есть действие, я выполняю поиск, хотя предпочтения ищут соответствующий ключ. Если я найду один, я удаляю все предпочтения, затем добавляю соответствующий или его дочерние элементы, если это PreferenceGroupe обратно.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);
    String act = getIntent().getAction();

    if (act != null) {
        Preference res = findPreferenceByKey(getPreferenceScreen(), act);
        if (res != null) {
            getPreferenceScreen().removeAll();
            if (res instanceof PreferenceGroup) {
                PreferenceGroup groupe = (PreferenceGroup) res;
                // add sub items
                for (int i = 0; i < groupe.getPreferenceCount(); i++) {
                    Preference pref = groupe.getPreference(i);
                    if (pref != null) {
                        getPreferenceScreen().addPreference(pref);
                    }
                }
            } else { // just add the item.
                getPreferenceScreen().addPreference(res);
            }
        }
    }
}

protected Preference findPreferenceByKey(PreferenceGroup in, String key) {
    for (int i = 0; i < in.getPreferenceCount(); i++) {
        Preference pref = in.getPreference(i);
        if (pref == null) {
            // should not happen
            Log.v(TAG, "findPreferenceByKey null pref i:" + i);
            return null;
        } else if (pref.hasKey() && pref.getKey().equals(key)) {
            return pref;
        } else if (pref instanceof PreferenceGroup) {
            // recurse
            Preference res = findPreferenceByKey((PreferenceGroup) pref,
                    key);
            if (res != null) {
                return res;
            }
        }
    }
    return null;
}
0 голосов
/ 06 октября 2011

Прежде всего, фрагмент предпочтения доступен для вас через пакет совместимости Android: http://developer.android.com/sdk/compatibility-library.html

Во-вторых, да, это возможно.Когда вы создаете свой фрагмент или acitvity (который когда-либо решите), используйте метод addPreferencesFromIntent () (http://developer.android.com/reference/android/preference/PreferenceFragment.html#addPreferencesFromIntent%28android.content.Intent%29), и вместо добавления всего экрана просто добавьте нужный подэкран.

...