如何在库中使用首选项标题?

时间:2014-04-10 08:29:38

标签: android xml preference

我可以通过将首选项的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);
    }
}

有没有办法解决这个问题?

1 个答案:

答案 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);
    }
}

问候。