【发布时间】:2014-04-10 08:29:38
【问题描述】:
我可以通过将首选项的 XML 资源 ID(比如 App1 中的 R.xml.settings1 和 App2 中的 R.xml.settings2)传递给 PreferenceActivity 来为通过库共享代码的应用程序创建首选项通过 bundle putInt 方法的 lib。在 PreferenceActivity 的 onCreate 方法中,我只需按如下方式加载 XML:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Bundle bundle = getIntent().getExtras();
if(null!=bundle)
{
int settingsID = bundle.getInt("SettingsID");
if(0<settingsID)
addPreferencesFromResource(settingsID);
}
}
一切正常。
现在我想使用库中的首选项标头,如 Android 文档中所述: http://developer.android.com/guide/topics/ui/settings.html#PreferenceHeaders
方法 loadHeadersFromResource 应该在 PreferenceActivity 的 onBuildHeaders 方法中调用,但如前所述:
注意:使用首选项标头时,您的 PreferenceActivity 子类不需要实现 onCreate() 方法,因为 Activity 唯一需要的任务就是加载标头。
但是 onBuildHeaders 早在 onCreate 之前就被调用了,因此我无法将首选项的 XML 资源 ID 传递给 loadHeadersFromResource
@Override
public void onBuildHeaders(List<Header> target)
{
loadHeadersFromResource(settingsID, target);
}
其中 settingsID 将分别是来自 App1 或 App2 的首选项标头的资源 ID,即 com.company.app1 包中的 R.xml.settings_headers1 或 com.company.app2 包中的 R.xml.settings_headers2...
编辑: 如果我在 onBuildHeaders 中加载一个空 XML(比如 com.company.lib 包中的 R.xml.empty_settings),然后在 onCreate 方法中加载“真实”XML,如下所示:
List<Header> mTarget = null;
@Override
public void onBuildHeaders(List<Header> target)
{
mTarget = target;
loadHeadersFromResource(R.xml.empty_settings, target);
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Bundle bundle = getIntent().getExtras();
if(null!=bundle)
{
int settingsID = bundle.getInt("SettingsID");
if(0<settingsID&&null!=mTarget)
loadHeadersFromResource(settingsID, mTarget);
}
}
偏好活动中不显示任何内容!
最后在 onBuildHeaders 中加载一个非空的虚拟 XML,然后在 onCreate 方法中加载“真实”的 XML,但会显示从虚拟 XML 加载的无用虚拟首选项:
List<Header> mTarget = null;
@Override
public void onBuildHeaders(List<Header> target)
{
mTarget = target;
loadHeadersFromResource(R.xml.dummy_settings, target);
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Bundle bundle = getIntent().getExtras();
if(null!=bundle)
{
int settingsID = bundle.getInt("SettingsID");
if(0<settingsID&&null!=mTarget)
loadHeadersFromResource(settingsID, mTarget);
}
}
有没有办法解决这个问题?
【问题讨论】:
标签: android xml preference