【问题标题】:How to use preference headers in a library?如何在库中使用首选项标题?
【发布时间】: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


    【解决方案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);
        }
    }
    

    问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      相关资源
      最近更新 更多