
背景
我正在尝试保留一个尽可能模块化的应用程序.
该应用程序将具有不同时间间隔执行的任务.我的目标是尽可能简单地添加新任务,同时对底层架构的理解最少,而不必修改其他文件,但同时又不会使代码复杂化.
如果你需要做的就是添加新任务就是创建文件就是完美的.
这将需要在运行时加载我不喜欢的任务,我可以住在一个完成所有注册的地方(这也可以切换任务)
现在我有一个抽象的任务类,它有一段静态代码,用于记录所有任务(基本上将它们添加到列表中).
问题
每个任务都有自己的首选项和可能的资源.
通过使用名称的前缀来划分字符串和数组非常简单,但主要问题是首选项.
现在我正在使用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中保持模块化 – 以良好的方式划分资源全部内容,希望文章能够帮你解决在android中保持模块化 – 以良好的方式划分资源所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)