获得v7 compat ActionBarContainer

时间:2014-05-06 15:00:44

标签: android android-actionbar-compat

作为我正在处理的应用程序的一部分,我正在尝试获取对ActionBar容器视图的引用。我使用了来自this question的答案,只要有问题的Android设备运行的是API级别11或更高版本,它就能很好地适用于我。但是,应用程序需要尽可能早于API级别9(目标API级别为19),并且Gingerbread设备给我带来了问题。我最初使用Sherlock进行项目,但最近切换到了v7 compat库。我可以在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;
}

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

  1. resId在v11设备上向上解析为正确的ID值,但在v11之前的设备上解析为0。
  2. 使用它的代码有适当的检查来处理null结果,这就是为什么我只是吃异常。 try / catch块大多只是为了以防万一,由于一些怪异的事件,ClassCastException设法被抛出(它永远不应该,因为容器是FrameLayout的子类。)
  3. 我检查并重新检查了我的进口商品;我所有的ActionBar引用(以及所有相关内容,比如我正在扩展的ActionBarActivity超类)是v7 compat库版本,而不是标准库版本。
  4. action_bar_container ID应存在于v7 compat库中,if this is any indication
  5. 此时我的想法已经过时了。我有什么简单的东西吗?任何建议将不胜感激,如果您需要更多背景/澄清,请告诉我。

1 个答案:

答案 0 :(得分:4)

我认为你的错误是在

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

对于api级别< 11,该软件包应该是您的应用程序包而不是plataform的软件包" android"