我在弄清楚ActionBar
的高度时遇到了一个奇怪的问题。我的应用程序中有几个部分位于ActionBar
正下方,我也使用了Chris Banes的库actionbar-pulltorefresh。
我将使用pull to refresh库中的示例。我遇到了与问题here完全相同的事情,除了我正在完成指南对Fragments
所说的一切。它基本上计算ActionBar
的高度约为应有的一半。同样在应用的不同部分,我将PopupWindow
定位在ActionBar
下方,因此我调用getHeight()
并将该位置用于我的窗口,我得到的问题与随着刷新库。
因此,我认为这与测量ActionBar
高度的方式有关,而且可能是样式问题。
但这里有趣的地方。如果我将设备旋转到横向模式,它会将高度精确地计算出来并将所有内容放在该点上,即使我旋转回纵向也是如此。它突然修复,直到我重新启动应用程序并从内存中删除它并重新开始。
任何人都有过类似的事情吗?
注意:我现在正在使用appcompat库,但之前我使用的是ActionBarSherlock,以及某些时候的基本ActionBar,并且所有场景都给出了相同的结果。
更新1:我从问题here,here和here获得了相同的结果。但是我正在做README所说的所有事情,所以我非常有信心这与我的设备测量ActionBar
高度的方式有关。
更新2:我在另一项活动中使用了操作栏PullToRefresh库并且工作正常,因此必须与我的主Activity
有关。
答案 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
。以下是调查结果。
<!-- Default height of an action bar. -->
<dimen name="action_bar_default_height">48dip</dimen>
<!-- Default height of an action bar. -->
<dimen name="action_bar_default_height">40dip</dimen>
<!-- 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()。
这是返回错误高度的原因,很可能是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's height is 0
。