我可以通过将首选项的XML资源ID(例如App1中的R.xml.settings1和App2中的R.xml.settings2)传递给PreferenceActivity来为我的应用程序创建首选代码的首选项。 lib通过bundle putInt方法。在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
应该在PreferenceActivity的onBuildHeaders方法中调用loadHeadersFromResource方法,但如上所述:
注意:使用首选项标头时,PreferenceActivity的子类不需要实现onCreate()方法,因为活动唯一需要的任务是加载标题。
但onCildHeaders在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);
}
}
有没有办法解决这个问题?
答案 0 :(得分:1)
最后我想出来了!
由于标题列表保留为成员变量,所以诀窍是在onBuildHeaders中添加一个虚拟标头,并在onCreate中删除它,然后从相应的应用程序添加所需的标题,如下所示:
List<Header> mHeaders = null;
@Override
public void onBuildHeaders(List<Header> target)
{
mHeaders = target;
// Add a single dummy header
loadHeadersFromResource(R.xml.dummy_header, target);
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Remove dummy header added in onBuildHeaders
if(null!=mHeaders&&1==mHeaders.size())
mHeaders.remove(0);
Bundle bundle = getIntent().getExtras();
if(null!=bundle)
{
int headersID = bundle.getInt("HeadersID");
if(0<headersID&&null!=mHeaders)
loadHeadersFromResource(headersID, mHeaders);
}
}
问候。