在xml中将工具栏的高度设置为attr/actionBarSize的一半

7
有没有办法在布局xml文件中将“android.support.v7.widget.Toolbar”的高度设置为预定义属性“?android:attr/actionBarSize”的一半? 实际上,我希望我的工具栏的高度类似于:
<android.support.v7.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height=("?android:attr/actionBarSize")/2
    >

不行,你需要通过编程设置或手动在xml文件中应用。 - Piyush
2
@9sol,那是不正确的。它接受56dp、48dp(横向)、64dp(在sw600dp上)。 - azizbekian
1
不要将任何值硬编码为默认值,因为它们可能会随着新的Android API(或其他设备)而改变,我会通过编程方式设置它 - 获取android:attr/actionBarSize的值,进行乘法运算并设置。 - Deividas Strioga
我已经添加了一个答案,其中包含如何在Java代码中实现此操作的一些详细信息,@Mostafa,请让我知道这是否适用于您。 - MatPag
1
@MatPag,正如OP在他的评论中提到的那样,他知道有编程解决方案,所以他特别想知道XML解决方案。在我看来,提供一个不完全回答问题(像你做的那样的编程方式),并不意味着问题应该被更改。感谢您的合作。 - azizbekian
显示剩余5条评论
2个回答

2
无法在xml中执行算术操作。
如果您想通过xml提供值,则必须执行以下操作:
  1. values/dimes.xml中定义一个变量halfActionBar,并将其设置为28dp(原始值为56dp)。
  2. values-land/dimes.xml中定义一个变量halfActionBar,并将其设置为24dp(原始值为48dp)。
  3. values-sw600dp-v13/dimes.xml中定义一个变量halfActionBar,并将其设置为32dp(原始值为64dp)。
在您的styles.xml主题中。
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:actionBarSize">@dimen/halfActionBar</item>
    ...
</style>

然后在您的布局中:
<android.support.v7.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="?android:attr/actionBarSize"/>

请注意,这是一个糟糕的解决方案,因为它取决于平台实现。我建议从Java / Kotlin代码(而不是从XML)获取 actionBarSize

我不喜欢这个解决方案,因为它对Android平台的变化非常容易出错。我认为唯一有效的方法是使用Java代码来完成这个任务。等我回家后,我会尝试一些不同的方法。 - MatPag
@MatPag,完全同意。 - azizbekian

1
你不能在XML中完成这个任务,但如果你想采用编程方式,可以尝试像这样做,我从这里获取了灵感。
//themedContext is an Activity or a Context which has a Theme attached,
//you can't use Application context for this
final TypedArray array = themedContext.getTheme().obtainStyledAttributes(
                new int[] { android.R.attr.actionBarSize });
int actionBarSize = (int) array.getDimensionPixelSize(0, -1);
array.recycle();

然后将此应用于工具栏,您可以执行以下操作:
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);

RelativeLayout.LayoutParams layoutParams = 
                 (RelativeLayout.LayoutParams) myToolbar.getLayoutParams();
//half the height of toolbar prior to set its value
layoutParams.height = (int)(actionBarSize / 2);
myToolbar.setLayoutParams(layoutParams);

setSupportActionBar(myToolbar);

PS:不要忘记,当设备旋转时,此属性值会发生变化,因此您应该在设备从纵向模式切换到横向模式及其反之后每次设置此自定义值。


2
我知道我可以用编程的方式做到这一点,问题在于如何在 XML 文件中定义该值,因为似乎这是不可能的。 - Mostafa
不,使用XML无法可靠地实现,您在问题中没有提供任何提示表明您不打算尝试Java代码,这就是我发布答案的原因。 - MatPag

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