在操作栏下方叠加显示位置视图

19

我想通过覆盖,将视图放置在操作栏下方。是否可以通过XML布局实现此目的?

我想避免使用常量,因为已经有至少4个可能的值,而这个数字很可能会增长。

ActionBarSherlock兼容是一个优点。

3个回答

46

android:layout_marginTop="?attr/actionBarSize"

这将自动考虑基于屏幕配置的大小更改。您可以在随ActionBarSherlock一起提供的“Demos”示例中的“Overlay”示例中查看其使用演示。


谢谢!你确定配置更改会影响边距吗? - hpique
1
只要您不在清单文件中处理配置更改,它肯定会生效。 - Jake Wharton
无论如何,它应该仍然能够相对良好地工作。处理配置更改可以防止ABS完全重新创建其视图,这意味着您可能会看到一些显示不一致的情况。在文档中,Google也将其声明为最后的手段。 - Jake Wharton
在进一步检查 ActionBarSherlock 代码后,发现 ?attr/actionBarSize 是针对每个已知的屏幕/高度组合定义常量的方法。但是该方法并不具备向前兼容性。还是感谢您的帮助。 - hpique
它是向前兼容的。它适用于所有API级别和所有主题。如果您想本地实现此功能(API 11+),则可以使用?android:attr/actionBarSize - Jake Wharton
显示剩余2条评论

7

Jake Wharton的答案在处理配置更改时无法正常工作。

以下是我通过代码解决此问题的方法,希望能对大家有所帮助:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    layoutTheView();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    layoutTheView();
}

private void layoutTheView() {
    ActionBar actionBar = this.getSupportActionBar();
    ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mTheView.getLayoutParams();
    int actionBarHeight = actionBar.getHeight();
    params.setMargins(0, actionBarHeight, 0, 0);
    mTheView.setLayoutParams(params);
    mTheView.requestLayout();
}

+1。有趣。这对我有效,但用params.topMargin = actionBarHeight;替换params.setMargins(0, actionBarHeight, 0, 0);则不行。(4.2.1)另外,setLayoutParams调用了requestLayout,所以不需要最后一行代码。 - dokkaebi

-1

使用上内边距

android:paddingTop="50dp"


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