获取 v7 兼容的 ActionBarContainer

Posted

技术标签:

【中文标题】获取 v7 兼容的 ActionBarContainer【英文标题】:Getting the v7 compat ActionBarContainer 【发布时间】:2014-05-06 15:00:44 【问题描述】:

作为我正在开发的应用程序的一部分,我正在尝试获取对ActionBar 的容器视图的引用。我使用了来自this question 的答案,只要有问题的 android 设备运行 API 级别 11 或更高版本,它就可以很好地工作。但是,该应用程序需要追溯到 API 级别 9(目标 API 级别是 19),而 Gingerbread 设备给我带来了问题。我最初在该项目中使用 Sherlock,但最近改用了 v7 兼容库。我可以在 Gingerbread 设备上以正常方式查看操作栏并与之交互(按钮工作等),但是当我尝试获取容器时它失败了。我正在使用的代码是这样的(注意 - 它在 ActionBarActivity 的子类中运行):

private FrameLayout getActionBarContainer() 
    FrameLayout result = null;

    int resId = getResources().getIdentifier("action_bar_container", "id", "android");
    try 
        result = (FrameLayout)getWindow().getDecorView().findViewById(resId);
    
    catch (Exception e) 
        // If we get an exception, just eat it
    

    return result;

在被问到之前回答几个问题:

    resId 在 v11 及更高版本的设备上解析为正确的 ID 值,但在 v11 之前的设备上解析为 0。 使用它的代码有适当的检查来处理空结果,这就是为什么我只是吃异常。 try/catch 块主要是为了以防万一,由于一些奇怪的事件,ClassCastException 设法被抛出(它永远不应该,因为容器是 FrameLayout 的子类)。 我检查并重新检查了我的进口;我所有的 ActionBar 引用(以及所有相关的东西,比如我正在扩展的 ActionBarActivity 超类)都是 v7 兼容库版本,而不是标准库版本。 action_bar_container ID 应存在于 v7 兼容库 if this is any indication 中。

我现在几乎没有想法了。我缺少一些简单的东西吗?任何建议都将不胜感激,如果您需要更多上下文/说明,请告诉我。

【问题讨论】:

【参考方案1】:

我认为你的错误是在

的最后一个参数上
int resId = getResources().getIdentifier("action_bar_container", "id", "android");

对于 api 级别

【讨论】:

先生,您是一位绅士和一位学者。那完美的伎俩。谢谢!

以上是关于获取 v7 兼容的 ActionBarContainer的主要内容,如果未能解决你的问题,请参考以下文章

support v7兼容包的用途(三 、v7兼容包和系统自带的比较和注意点)

Android Support v4,v7,v13的区别和应用场景

support v7兼容包有啥用(一 、啥是支持库)

AppCompat学习-AppCompatSpinner

Arduino I/O Expansion Shield V7.1

博途v17可以和200smart可以兼容吗