Android ActionBar 高度问题

5
我遇到了一个奇怪的问题,无法确定 ActionBar 的高度。我的应用程序中有一些内容紧贴着 ActionBar 来显示,同时我也使用了 Chris Banes 的库 actionbar-pulltorefresh

我将使用下拉刷新库中的示例。我遇到了和这里 here 中描述的完全相同的问题,只不过我按照指南使用Fragments 做了一切。它基本上会将 ActionBar 的高度计算为实际高度的一半。在应用程序的另一个部分,我将 PopupWindow 定位在 ActionBar 下方,所以我调用了 getHeight() 并使用该位置来定位窗口,但我遇到了与下拉刷新库相同的问题。

这使我认为这可能与 ActionBar 高度的测量有关,可能是样式问题。

但是这里有趣的地方在于,如果我将设备旋转到横屏模式,它会正确计算高度并将所有内容放置在应该放置的位置,即使我再次旋转回纵向。它突然间就被修复了,直到我重新启动应用程序并从内存中杀死它,然后重新开始。

有人有类似的经历吗?

注意:我现在正在使用appcompat库,但之前我使用过ActionBarSherlock,以及某个时候使用了基本的ActionBar,所有情况都给出了相同的结果。

更新1: 我从这里hereherehere得到了相同的结果。但是我按照README上说的做了一切,所以我相当自信它与我的设备如何测量 ActionBar 高度有关。

更新2: 我在另一个活动中使用了actionbar PullToRefresh库,它运行正常,因此必须与我的主要Activity有关。


问题是你何时调用getHeight()?就下拉刷新库而言,它在特定时间调用。即当View被创建时。顺便提一句,你正在使用view pager吗? - Mohsin Naeem
我在一些“片段”中使用了“ViewPager”,但问题存在于父“Activity”中的任何位置。 - Wenger
我在我的ActivityonCreate()方法中,将getHeight()作为其中一件最先调用的事情。 - Wenger
2个回答

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

等我有更多时间时,可能会寻找问题的根源,但在那之前,你可以将这三个值添加到不同值文件夹中(作为临时解决方案)。


似乎问题在于actionBarSize返回了错误的值。它只有应该有大小的一半。 - Wenger
好的。现在这是我要写下的第一个答案(但找不到来源):我记得在Android文档中有一处提到,ActionBar在纵向时高度为50dp,在横向时(智能手机设备)高度为44dp。但是,我很快会更新我的答案。 - Anonsage
谢谢。那应该可以作为一个权宜之计,如果这是我能做的最好的,那么我想那就只能这样了。 - Wenger
我已将这些行添加到相应的dimens.xml文件夹中。我还需要使用主题应用这些尺寸吗? - Wenger
你不需要对主题进行任何操作。现在,你只需将以下属性添加到被 ActionBar 覆盖的 XML 视图中:android:layout_marginTop="@dimen/action_bar_default_height" - Anonsage

4
我在Activity的onCreate()方法中首先调用了getHeight()方法。
这将返回错误的高度,很可能是0。此时,ActionBar还没有准备好提供有关自身的详细信息。它正在创建过程中,以及活动视图的其余部分。
请尝试以下操作:
@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的高度为0


谢谢,我今晚会试一下。即使我在代码中没有调用 getHeight(),PullToRefresh 库仍然会给我链接的结果。 - Wenger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接