ActionBar 的大小是多少(以像素为单位)?

发布于 2024-11-30 22:36:18 字数 49 浏览 2 评论 0原文

我需要知道 ActionBar 的确切大小(以像素为单位),以便应用正确的背景图像。

I need to know the exact size of ActionBar in pixels so to apply correct background image.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(15

星星的轨迹 2024-12-07 22:36:18

要在 XML 中检索 ActionBar 的高度,只需使用

?android:attr/actionBarSize

或者如果您是 ActionBarSherlock 或 AppCompat 用户,请使用此值

?attr/actionBarSize

如果您在运行时需要此值,请使用此值

final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(
                    new int[] { android.R.attr.actionBarSize });
mActionBarSize = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();

如果您需要了解此值的定义位置:

  1. 属性名称本身是在平台的 /res/values/attrs.xml
  2. 平台的 themes.xml 选择此属性并为其分配一个值。
  3. 步骤2中分配的值取决于不同的设备尺寸,这些尺寸在 各种中定义平台中的dimens.xml文件,即。 core/res/res/values-sw600dp/dimens.xml

To retrieve the height of the ActionBar in XML, just use

?android:attr/actionBarSize

or if you're an ActionBarSherlock or AppCompat user, use this

?attr/actionBarSize

If you need this value at runtime, use this

final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(
                    new int[] { android.R.attr.actionBarSize });
mActionBarSize = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();

If you need to understand where this is defined:

  1. The attribute name itself is defined in the platform's /res/values/attrs.xml
  2. The platform's themes.xml picks this attribute and assigns a value to it.
  3. The value assigned in step 2 depends on different device sizes, which are defined in various dimens.xml files in the platform, ie. core/res/res/values-sw600dp/dimens.xml
香草可樂 2024-12-07 22:36:18

从Android 3.2的framework-res.apk反编译源码来看,res/values/styles.xml包含:

<style name="Theme.Holo">
    <!-- ... -->
    <item name="actionBarSize">56.0dip</item>
    <!-- ... -->
</style>

3.0和3.1似乎是相同的(在至少来自 AOSP)...

From the de-compiled sources of Android 3.2's framework-res.apk, res/values/styles.xml contains:

<style name="Theme.Holo">
    <!-- ... -->
    <item name="actionBarSize">56.0dip</item>
    <!-- ... -->
</style>

3.0 and 3.1 seem to be the same (at least from AOSP)...

梦回梦里 2024-12-07 22:36:18

要获取 Actionbar 的实际高度,您必须在运行时解析属性 actionBarSize

TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);

To get the actual height of the Actionbar, you have to resolve the attribute actionBarSize at runtime.

TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);
天冷不及心凉 2024-12-07 22:36:18

Honeycomb 示例之一引用 ?android:attr/actionBarSize

One of the Honeycomb samples refers to ?android:attr/actionBarSize

我们的影子 2024-12-07 22:36:18

我需要在 ICS 兼容性应用程序中正确复制这些高度,并深入研究 框架核心源代码。上面的两个答案都是正确的。

它基本上归结为使用限定符。高度由尺寸“action_bar_default_height”定义,

默认定义为 48dip。但对于 -land 来说,它是 40dip,对于 sw600dp 来说,它是 56dip。

I needed to do replicate these heights properly in a pre-ICS compatibility app and dug into the framework core source. Both answers above are sort of correct.

It basically boils down to using qualifiers. The height is defined by the dimension "action_bar_default_height"

It is defined to 48dip for default. But for -land it is 40dip and for sw600dp it is 56dip.

油饼 2024-12-07 22:36:18

获取高度

@dimen/abc_action_bar_default_height

如果您使用最新 v7 appcompat 支持包中的兼容性 ActionBar,则可以使用文档

If you're using the compatibility ActionBar from the recent v7 appcompat support package, you can get the height using

@dimen/abc_action_bar_default_height

Documentation

一场信仰旅途 2024-12-07 22:36:18

使用新的 v7 支持库 (21.0.0) R.dimen 中的名称已更改为 @dimen/abc_action_bar_default_height_材质

因此,当从以前版本的支持库升级时,您应该使用该值作为操作栏的高度

With the new v7 support library (21.0.0) the name in R.dimen has changed to @dimen/abc_action_bar_default_height_material.

When upgrading from a previous version of the support lib you should therefore use that value as the actionbar's height

一世旳自豪 2024-12-07 22:36:18

如果您使用 ActionBarSherlock,您可以使用以下命令获取高度

@dimen/abs__action_bar_default_height

If you are using ActionBarSherlock, you can get the height with

@dimen/abs__action_bar_default_height
折戟 2024-12-07 22:36:18

@AZ13的答案很好,但是根据Android设计指南,ActionBar应该是< a href="http://developer.android.com/design/style/metrics-grids.html#examples" rel="noreferrer">至少 48dp 高。

@AZ13's answer is good, but as per the Android design guidelines, the ActionBar should be at least 48dp high.

情魔剑神 2024-12-07 22:36:18

Kotlin 中接受的答案:

val Context.actionBarSize
    get() = theme.obtainStyledAttributes(intArrayOf(android.R.attr.actionBarSize))
        .let { attrs -> attrs.getDimension(0, 0F).toInt().also { attrs.recycle() } }

用法:

val size = actionBarSize                    // Inside Activity
val size = requireContext().actionBarSize   // Inside Fragment
val size = anyView.context.actionBarSize    // Inside RecyclerView ViewHolder

Accepted answer in Kotlin :

val Context.actionBarSize
    get() = theme.obtainStyledAttributes(intArrayOf(android.R.attr.actionBarSize))
        .let { attrs -> attrs.getDimension(0, 0F).toInt().also { attrs.recycle() } }

Usage :

val size = actionBarSize                    // Inside Activity
val size = requireContext().actionBarSize   // Inside Fragment
val size = anyView.context.actionBarSize    // Inside RecyclerView ViewHolder
夏日落 2024-12-07 22:36:18
public int getActionBarHeight() {
    int actionBarHeight = 0;
    TypedValue tv = new TypedValue();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv,
                true))
            actionBarHeight = TypedValue.complexToDimensionPixelSize(
                    tv.data, getResources().getDisplayMetrics());
    } else {
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,
                getResources().getDisplayMetrics());
    }
    return actionBarHeight;
}
public int getActionBarHeight() {
    int actionBarHeight = 0;
    TypedValue tv = new TypedValue();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv,
                true))
            actionBarHeight = TypedValue.complexToDimensionPixelSize(
                    tv.data, getResources().getDisplayMetrics());
    } else {
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,
                getResources().getDisplayMetrics());
    }
    return actionBarHeight;
}
遗忘曾经 2024-12-07 22:36:18

类摘要通常是一个不错的起点。我认为 getHeight() 方法应该足够了。

编辑:

如果您需要宽度,它应该是屏幕的宽度(对吗?)并且可以收集像这样

The Class Summary is usually a good place to start. I think the getHeight() method should suffice.

EDIT:

If you need the width, it should be the width of the screen (right?) and that can be gathered like this.

江南烟雨〆相思醉 2024-12-07 22:36:18

在我的 Galaxy S4 上有 > 441dpi> 1080×1920>
使用 getResources().getDimensionPixelSize 获取 Actionbar 高度 我得到 144 像素。

使用公式 px = dp x (dpi/160),我使用的是 441dpi,而我的设备位于
在 480dpi 类别中。所以这样就证实了结果。

On my Galaxy S4 having > 441dpi > 1080 x 1920 >
Getting Actionbar height with getResources().getDimensionPixelSize I got 144 pixels.

Using formula px = dp x (dpi/160), I was using 441dpi, whereas my device lies
in the category 480dpi. so putting that confirms the result.

在你怀里撒娇 2024-12-07 22:36:18

我自己就是这样做的,这个辅助方法应该对某人有用:

private static final int[] RES_IDS_ACTION_BAR_SIZE = {R.attr.actionBarSize};

/**
 * Calculates the Action Bar height in pixels.
 */
public static int calculateActionBarSize(Context context) {
    if (context == null) {
        return 0;
    }

    Resources.Theme curTheme = context.getTheme();
    if (curTheme == null) {
        return 0;
    }

    TypedArray att = curTheme.obtainStyledAttributes(RES_IDS_ACTION_BAR_SIZE);
    if (att == null) {
        return 0;
    }

    float size = att.getDimension(0, 0);
    att.recycle();
    return (int) size;
}

I did in this way for myself, this helper method should come in handy for someone:

private static final int[] RES_IDS_ACTION_BAR_SIZE = {R.attr.actionBarSize};

/**
 * Calculates the Action Bar height in pixels.
 */
public static int calculateActionBarSize(Context context) {
    if (context == null) {
        return 0;
    }

    Resources.Theme curTheme = context.getTheme();
    if (curTheme == null) {
        return 0;
    }

    TypedArray att = curTheme.obtainStyledAttributes(RES_IDS_ACTION_BAR_SIZE);
    if (att == null) {
        return 0;
    }

    float size = att.getDimension(0, 0);
    att.recycle();
    return (int) size;
}
摘星┃星的人 2024-12-07 22:36:18

来源:appcompact-1.6.1/res/values

<item name="actionBarSize">@dimen/abc_action_bar_default_height_material</item>


// values.xml
<dimen name="abc_action_bar_default_height_material">56dp</dimen>

//values-land.xml
<dimen name="abc_action_bar_default_height_material">48dp</dimen>

//values-sw600dp-v13.xml
<dimen name="abc_action_bar_default_height_material">64dp</dimen>

Source: appcompact-1.6.1/res/values

<item name="actionBarSize">@dimen/abc_action_bar_default_height_material</item>


// values.xml
<dimen name="abc_action_bar_default_height_material">56dp</dimen>

//values-land.xml
<dimen name="abc_action_bar_default_height_material">48dp</dimen>

//values-sw600dp-v13.xml
<dimen name="abc_action_bar_default_height_material">64dp</dimen>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文