ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

在android中保持模块化 – 以良好的方式划分资源

2019-06-30 17:13:48  阅读:197  来源: 互联网

标签:android modularity project-structure


背景

我正在尝试保留一个尽可能模块化的应用程序.
该应用程序将具有不同时间间隔执行的任务.我的目标是尽可能简单地添加新任务,同时对底层架构的理解最少,而不必修改其他文件,但同时又不会使代码复杂化.

如果你需要做的就是添加新任务就是创建文件就是完美的.
这将需要在运行时加载我不喜欢的任务,我可以住在一个完成所有注册的地方(这也可以切换任务)

现在我有一个抽象的任务类,它有一段静态代码,用于记录所有任务(基本上将它们添加到列表中).

问题

每个任务都有自己的首选项和可能的资源.
通过使用名称的前缀来划分字符串和数组非常简单,但主要问题是首选项.

现在我正在使用PreferenceActivity来显示我的偏好.
常规设置从XML文件加载.每个任务的首选项都位于一个单独的PreferenceScreen中.所有任务只有一个共同点,即“启用”复选框.

我不想将所有首选项存储在一个文件中,因为它有可能变得非常混乱.

当前解决方案

现在每个任务都有一个方法setupPreferences(PreferenceScreen),在这个方法中,他们可以添加他们想要的任何选项.然而,这具有以编程方式的缺点,这并不是那么糟糕但我想尽可能避免这种情况.

期望的解决方案

最佳解决方案是,如果每个任务都有自己的XML文件加载并添加到根PreferenceScreen,据我所知,这是不可能的,加载它的唯一方法是PreferenceActivity.

其他说明

如果有人对android中的资源划分有任何其他建议,请随意分享:)

谢谢
尼克拉斯

澄清

我正在谈论的任务从来都不是第三方,他们只会在内部.这是一个早期获得这个应用程序的良好结构的方法.

解决方法:

通过使用反射,我调用PreferenceManager.inflateFromResource(Context, int, PreferenceScreen)从我的XML文件创建一个PreferenceScreen.

字符串资源在单独的文件中分隔,并以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添加到根的底部.

标签:android,modularity,project-structure
来源: https://codeday.me/bug/20190630/1338592.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有