5

我在计算ActionBar. 我的应用程序中有几个部分位于 的正下方ActionBar,我还使用了 Chris Banes 的库actionbar-pulltorefresh

我将使用 pull to refresh 库中的示例。我遇到的问题与这里的问题完全相同,只是我正在按照指南所说的方式做所有事情Fragments。它基本上计算出的高度ActionBar约为应有的高度的一半。同样在应用程序的不同部分,我将 a 定位在PopupWindow下方ActionBar,因此我调用getHeight()并将该位置用于我的窗口,我遇到了与 pull to refresh 库相同的问题。

所以这让我觉得这与ActionBar身高的测量方式有关,可能是风格问题。

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

有没有人发生过类似的事情?

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

更新 1:我从这里这里这里的问题中得到了相同的结果。然而,我正在做 README 所说的一切,所以我相当有信心这与我的设备测量ActionBar高度的方式有关。

更新 2:我在另一个活动中使用了 actionbar PullToRefresh 库,它工作正常,所以它一定与我的 main Activity.

4

2 回答 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

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

于 2013-09-03T21:21:32.263 回答
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

于 2013-09-03T08:37:49.140 回答