Android ActionBar高度问题

时间:2013-08-07 03:57:20

标签: android actionbarsherlock android-actionbar android-actionbar-compat

我在弄清楚ActionBar的高度时遇到了一个奇怪的问题。我的应用程序中有几个部分位于ActionBar正下方,我也使用了Chris Banes的库actionbar-pulltorefresh

我将使用pull to refresh库中的示例。我遇到了与问题here完全相同的事情,除了我正在完成指南对Fragments所说的一切。它基本上计算ActionBar的高度约为应有的一半。同样在应用的不同部分,我将PopupWindow定位在ActionBar下方,因此我调用getHeight()并将该位置用于我的窗口,我得到的问题与随着刷新库。

因此,我认为这与测量ActionBar高度的方式有关,而且可能是样式问题。

但这里有趣的地方。如果我将设备旋转到横向模式,它会将高度精确地计算出来并将所有内容放在该点上,即使我旋转回纵向也是如此。它突然修复,直到我重新启动应用程序并从内存中删除它并重新开始。

任何人都有过类似的事情吗?

注意:我现在正在使用appcompat库,但之前我使用的是ActionBarSherlock,以及某些时候的基本ActionBar,并且所有场景都给出了相同的结果。

更新1:我从问题hereherehere获得了相同的结果。但是我正在做README所说的所有事情,所以我非常有信心这与我的设备测量ActionBar高度的方式有关。

更新2:我在另一项活动中使用了操作栏PullToRefresh库并且工作正常,因此必须与我的主Activity有关。

2 个答案:

答案 0 :(得分:14)

为了确保操作栏下没有视图,您可以在XML中为其添加上边距。

<SomeView
    ...
    android:layout_marginTop="?android:attr/actionBarSize" />

来源:http://developer.android.com/guide/topics/ui/actionbar.html#Style

更新:添加以下内容。我决定深入研究Android源代码,看看实际的ActionBar高度应该是多少。所以,我查看了所有不同类型的values / dimens.xml来查找action_bar_default_height。以下是调查结果。

values/dimens.xml

<!-- Default height of an action bar. -->
<dimen name="action_bar_default_height">48dip</dimen>

values-land/dimens.xml

<!-- Default height of an action bar. -->
<dimen name="action_bar_default_height">40dip</dimen>

values-sw600dp/dimens.xml

<!-- Default height of an action bar. -->
<dimen name="action_bar_default_height">56dip</dimen>

我还检查了以下内容,但它们没有覆盖此属性:

values-large
values-sw380dp
values-sw600dp-land
values-sw720dp
values-w360dp
values-w600dp
values-w720dp
values-xlarge

当我有更多时间时,我可能会查找问题的根源,但在此之前,您可以在不同的值文件夹中添加这三个值(作为临时修复)。

答案 1 :(得分:4)

  

我将getHeight()称为我的Activity中的第一件事   的onCreate()。

这是返回错误高度的原因,很可能是0ActionBar目前尚未准备好向您提供有关自身的详细信息。它正在被创建,以及活动的其余视图。

尝试以下方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Don't call setContentView(int)

    // Inflate the layout file that 
    // you would have used with setContentView(R.layout.xml_file)
    View mContentView = getLayoutInflater().inflate(R.layout.xml_file, null);

    // Add this Runnbale to mContentView's message queue
    mContentView.post(new Runnable() {

        @Override
        public void run() {
            Toast.makeText(Your_Activity.this, "ActionBar's height is " + 
                        getActionBar().getHeight(), Toast.LENGTH_LONG).show();
        }

    });

    // Initialize widgets contained in R.layout.xml_file

    // Example
    Button b = (Button) mContentView.findViewById(R.id.button_id);

    ....        

    setContentview(mContentView);
}

这应该为ActionBar的高度提供正确的值。

作为概念验证,请注释mContentView.post(...);并简单地显示Toast。 Toast很可能会说ActionBar's height is 0