Поддержание модульности в Android - хорошее разделение ресурсов - PullRequest
4 голосов
/ 09 июня 2011

Фон

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

Было бы идеально, если бы всевам нужно сделать, чтобы добавить новую задачу, это создать файл и все.
Это потребует загрузки задач во время выполнения, что мне не очень нравится, я мог бы жить в одном месте, где вся регистрация сделана(это также позволило переключать задачи)

Сейчас у меня есть абстрактный класс задач, в котором есть фрагмент статического кода, который регистрирует все задачи (в основном добавляет их в список).

Проблема

Каждая задача будет иметь собственный набор предпочтений и, возможно, ресурсы.
Разделить строки и массив довольно просто, используя префиксы для имен, но основная проблема связана с настройками.

Сейчас я использую PreferenceActivity для отображения своих предпочтений.
Общие настройкидобавлено из файла XML.Настройки каждой задачи находятся в отдельном PreferenceScreen.У всех задач есть только одна общая черта, и это флажок «Включено».

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

Текущее решение

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

Желаемое решение

Оптимальное решение было бы, если бы каждая задачасобственный XML-файл, который загружается и добавляется в корень PreferenceScreen, насколько я знаю, однако это невозможно, единственный способ загрузить его в PreferenceActivity.

Другие примечания

Если у кого-то есть другие предложения по разделению ресурсов в Android, не стесняйтесь делиться ими:)

Спасибо
Никлас


Уточнение

ЗадачиЯ говорю о том, что никогда не будет третьей стороной, они будут только внутренними.Это скорее способ получить хорошую структуру этого приложения.

Ответы [ 2 ]

3 голосов
/ 17 июня 2011

Используя рефлексию, я звоню PreferenceManager.inflateFromResource(Context, int, PreferenceScreen), чтобы создать PreferenceScreen из моих файлов XML.

Строковые ресурсы разделяются в отдельные файлы и имеют префикс taskname_

Вот код для надувания PreferenceScreen, он должен быть помещен в PreferenceActivity:

/**
 * Inflates a {@link android.preference.PreferenceScreen PreferenceScreen} from the specified
 * resource.<br>
 * <br>
 * The resource should come from {@code R.xml}
 * 
 * @param resId The ID of the XML file
 * @return The preference screen or null on failure.
 */
private PreferenceScreen inflatePreferenceScreenFromResource(int resId) {
    try {
        Class<PreferenceManager> cls = PreferenceManager.class;
        Method method = cls.getDeclaredMethod("inflateFromResource", Context.class, int.class, PreferenceScreen.class);
        return (PreferenceScreen) method.invoke(getPreferenceManager(), this, resId, null);         
    } catch(Exception e) {
        Log.w(LOG_TAG, "Could not inflate preference screen from XML", e);
    }

    return null;
}

Вот пример того, как его использовать:

package com.example;

import java.lang.reflect.Method;

import com.example.R;

import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.util.Log;


public class ExamplePreferenceActivity extends PreferenceActivity {
    public static final String PREFERENCE_NAME = "ExamplePreferences";

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

        // Sets the preference name
        PreferenceManager pm = getPreferenceManager();
        pm.setSharedPreferencesName(PREFERENCE_NAME);

        // Adds default values and the root preference screen
        PreferenceManager.setDefaultValues(this, PREFERENCE_NAME, MODE_PRIVATE, R.xml.preferences_layout, false);
        addPreferencesFromResource(R.xml.preferences_layout);

        PreferenceScreen root = getPreferenceScreen();

        // Includes R.xml.other_preferences_layout and adds it to the bottom of the root preference screen
        PreferenceScreen otherPreferenceScreen = inflatePreferenceScreenFromResource(R.xml.other_preferences_layout);
        root.addPreference(otherPreferenceScreen);
        PreferenceManager.setDefaultValues(this, PREFERENCE_NAME, MODE_PRIVATE, R.xml.other_preferences_layout, false);
    }

    /**
     * Inflates a {@link android.preference.PreferenceScreen PreferenceScreen} from the specified
     * resource.<br>
     * <br>
     * The resource should come from {@code R.xml}
     * 
     * @param resId The ID of the XML file
     * @return The preference screen or null on failure.
     */
    private PreferenceScreen inflatePreferenceScreenFromResource(int resId) {
        try {
            Class<PreferenceManager> cls = PreferenceManager.class;
            Method method = cls.getDeclaredMethod("inflateFromResource", Context.class, int.class, PreferenceScreen.class);
            return (PreferenceScreen) method.invoke(getPreferenceManager(), this, resId, null);         
        } catch(Exception e) {
            Log.w(LOG_TAG, "Could not inflate preference screen from XML", e);
        }

        return null;
    }  
}

В этом примере будет использоваться res/xml/preferences_layout.xml в качестве корня, а затем добавлено res/xml/other_preferences_layout.xml в конец корня.

0 голосов
/ 10 июня 2011

Не совсем ответ на ваш вопрос, но в любом случае он может быть интересен: взгляните на API плагинов для Locale и Tasker: http://www.twofortyfouram.com/developer.html

Locale и Tasker - приложения для автоматизации телефона. Оба они легко настраиваются и являются модульными, они поддерживают сторонние плагины для расширения их функциональности. Как и в вашем случае, каждый плагин имеет уникальные настройки. Их решение проблемы заключается в том, что каждый плагин приносит свои собственные предпочтения активности, доступные с помощью определенных намеренных действий. Существуют рекомендации для пользовательского интерфейса, чтобы экраны настроек выглядели согласованно.

...