以编程方式设置工具栏高度 Android

set Toolbar height programmatically Android

我正在尝试通过这种方式以编程方式设置工具栏的高度:

toolbar.setLayoutParams(new Toolbar.LayoutParams(LayoutParams.MATCH_PARENT, 42));
toolbar.setMinimumHeight(42);

但它会导致此日志出现致命异常 -> android.widget.relativelayout$layoutparams cannot be cast to android.support.v7.Toolbar$layoutparams

我也试试这个变体:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) toolbar.getLayoutParams();
params.height = 42;   
toolbar.setLayoutParams(params);
toolbar.setMinimumHeight(42);

它没有例外,但它也不起作用,工具栏的默认高度比我定义的高。但是当然可以在 xml 中设置参数,但是我也需要在 java 中设置高度。

试试这个...

工具栏有自己的 LayoutParams。你不能将它转换为 RelativeLayout。

    Toolbar.LayoutParams params = (Toolbar.LayoutParams)mToolbar.getLayoutParams();
    params.height = 42;
    mToolbar.setLayoutParams(params);

如果你想在 运行 时设置工具栏的高度,只需这样做,

    int expected_height = your value;
    mToolbar.setMinimumHeight(expected_height );

试试这个 -

RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mToolbar.getLayoutParams();
layoutParams.height = 42;
mToolbar.setLayoutParams(layoutParams);

对我来说效果很好。

如果上面的代码仍然不起作用,请尝试在末尾添加这一行 -

mToolbar.requestLayout();

以上行将强制您的工具栏重新测量所有内容。您的代码可能无法正常工作,因为您试图在布局膨胀后更改高度。在那种情况下,您需要强制您的视图重新测量所有内容。查看以下方法以获取更多信息 - requestLayout()、invalidate() 和 forceLayout()。在移动中更改 LayoutParams 时,这三种方法很方便,但代价很高。如果您的布局非常重并且其中有很多子视图,调用这些方法中的任何一个都会影响您的应用程序的性能,特别是在低端设备上。所以一定要非常小心地使用这些方法。

您提到的崩溃之所以发生,是因为您的工具栏是根视图的子视图,而根视图是 RelativeLayout。希望对你有帮助。

此外,请不要遵循 Silambarasan Poonguti 的回答,因为它有点模棱两可。如果您尝试访问子 LayoutParams,则需要 LayoutParams 转换。即使 View 有自己的 LayoutParams,你也必须将它转换为 parent 或 root LayoutParams for ex。如果您的工具栏是 RelativeLayout 的子视图,那么将 LayoutParams 转换为 Toolbar.LayoutParams 将使应用程序崩溃,您必须将 LayoutParams 转换为 RelativeLayout.LayoutParams

为了避免您需要使用 ViewGroup.LayoutParams 的错误,因为 android.support.v7.Toolbar 使用它并且 returns 它在 mToolbar.getLayoutParams().