【问题标题】:Android ActionBar height issueAndroid ActionBar 高度问题
【发布时间】:2013-09-05 10:44:20
【问题描述】:

我在计算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 有关。

【问题讨论】:

  • 问题是你什么时候打电话给getHeight()?在特定时间拉动刷新库调用它。即当View 被创建时。在旁注中,您使用的是view pager?
  • 我在一些Fragments 中使用ViewPager,但问题存在于父Activity 中。
  • 我打电话给getHeight(),这是我ActivityonCreate()中的第一件事。

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


【解决方案1】:

为了确保 Action Bar 下没有 View,您可以在 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 返回了错误的值。大约是应有的一半。
  • 好的。现在这是我要记下的第一个答案(但找不到来源):我记得在 Android 文档的某处它说 ActionBar 纵向高 50dp,横向高 44dp(智能手机设备)。但是,我会尽快更新我的答案。
  • 谢谢。这应该可以起到创可贴的作用,如果这是我能做到的最好的,那么我想这将不得不奏效。
  • 我将这些行添加到相应的dimens.xml 文件夹中。我是否还必须使用主题来应用维度?
  • 您不需要对主题做任何事情。现在您只需将以下属性添加到 ActionBar 覆盖的 XML 视图中:android:layout_marginTop="@dimen/action_bar_default_height"
【解决方案2】:

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

这就是返回错误高度的原因,很可能是0ActionBar 目前还没有准备好向您提供有关其自身的详细信息。它与 Activity 的 View 的其余部分一起正在创建过程中。

尝试以下方法:

@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

【讨论】:

  • 谢谢,今晚我会试一试。即使我没有在任何地方的代码中调用getHeight(),PullToRefresh 库仍然会为我提供链接的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
相关资源
最近更新 更多