如何以编程方式正确获取 actionBar 大小?

How to get actionBar size properly programatically?

当发生 Button 单击时,我需要将 RecyclerView 向下移动 actionBar 的大小。

我试过这个代码

  params = (CoordinatorLayout.LayoutParams) myrv.getLayoutParams();

  public void changeRecyclerViewPosition() {
    params.setMargins(0, android.R.attr.actionBarSize, 0, 0);
    myrv.setLayoutParams(params);
}

因此,当单击 Button 时,RecyclerView 消失。

所以我尝试记录 android.R.attr.actionBarSize 值,但它太大了 (2130903043)。

我想也许结果在pixels中,需要转换成dp。

所以你们能向我解释一下哪里出了问题以及这种行为背后的原因吗?

编辑:

  <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp"
tools:context=".Activities.LoadSavedCoffretDataActivity">


<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@android:color/white"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

<ImageView
    android:id="@+id/cancel_img"
    android:layout_marginTop="?attr/actionBarSize"
    android:elevation="5dp"
    android:layout_width="48dp"
    android:layout_height="48dp"
    android:src="@drawable/cancel" />

<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerview_id"
    android:layout_marginTop="?attr/actionBarSize"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|center_horizontal">

    <ImageView
        android:id="@+id/delete_img"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:src="@drawable/ic_delete_forever_black_24dp"/>

</LinearLayout>

使用此 xml 固定应用栏大小 主线是

**android:minHeight="?attr/actionBarSize"**

<com.google.android.material.appbar.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/appBar"
            android:minHeight="?attr/actionBarSize"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent">
        <androidx.appcompat.widget.Toolbar
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/toolBar"
                android:theme="@style/Theme.AppCompat.Light.DarkActionBar"/>
    </com.google.android.material.appbar.AppBarLayout>

您可以通过

获取操作栏高度
public void changeRecyclerViewPosition() {
TypedValue tv = new TypedValue();
int actionBarHeight = 0;
if (getActivity().getTheme().resolveAttribute(R.attr.actionBarSize, tv, true))
{
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
params.setMargins(0,actionBarHeight, 0, 0);
myrv.setLayoutParams(params);
}