【问题标题】:Why am I getting class cast exception when I reference AppBarLayout and try to get it's LayoutParams using AppBarLayout.LayoutParams?当我引用 AppBarLayout 并尝试使用 AppBarLayout.LayoutParams 获取它的 LayoutParams 时,为什么会出现类转换异常?
【发布时间】:2018-06-08 18:59:16
【问题描述】:

我正在尝试获取 AppBarLayout 的布局参数,但出现此错误。

java.lang.ClassCastException: android.support.design.widget.CoordinatorLayout$LayoutParams 无法转换为 android.support.design.widget.AppBarLayout$LayoutParams

activity_scrolling.xml

<?xml version="1.0" encoding="utf-8"?>

<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:fitsSystemWindows="true"
tools:context=".ScrollingActivity">

<android.support.design.widget.AppBarLayout
    android:id="@+id/app_bar"
    android:layout_width="match_parent"
    android:layout_height="@dimen/app_bar_height"
    android:fitsSystemWindows="false"
    android:theme="@style/AppTheme.AppBarOverlay">

    <include layout="@layout/toolbar_scrollview"/> 

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

    <include layout="@layout/content_scrolling" />

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/fab_margin"
    app:layout_anchor="@id/app_bar"
    app:layout_anchorGravity="bottom|end"
    app:srcCompat="@android:drawable/ic_dialog_email" />

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

ScrollingActivity.java

public class ScrollingActivity extends AppCompatActivity implements 
                             AppBarLayout.OnOffsetChangedListener{


ConstraintLayout constraintLayout;

AppBarLayout appBarLayout;

static boolean toolbarOpen = true;
int lastPosition = 0;
float toolbarThreshhold = 0.3f;

ConstraintSet constraintSet_openToolbar = new ConstraintSet();
ConstraintSet constraintSet_closeToolbar = new ConstraintSet();

@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_scrolling);
    /*Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);*/

    appBarLayout = findViewById(R.id.app_bar);
    constraintLayout = findViewById(R.id.constraint_toolbar_layout);

    appBarLayout.addOnOffsetChangedListener(this);

    FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", 
                                      Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

}

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();

        constraintSet_openToolbar.clone(this, R.layout.toolbar_scrollview);
        constraintSet_closeToolbar.clone(this, 
                                        R.layout.toolbar_scrollview_closed);
        Log.d(ScrollingActivity.class.getSimpleName() 
                                       ,"onAttachedToWindow()");

}

@Override
public void onOffsetChanged(AppBarLayout appBarLayout1, int verticalOffset) {

    if (lastPosition == verticalOffset){
        return;
    }

    Log.d(ScrollingActivity.class.getSimpleName() ,"onOffset Entry");

    lastPosition = verticalOffset;
    float progress = Math.abs(verticalOffset / (float)appBarLayout.getHeight());

    Log.d(ScrollingActivity.class.getSimpleName() ,String.valueOf(lastPosition));

    AppBarLayout.LayoutParams layoutParams = (AppBarLayout.LayoutParams) appBarLayout1.getLayoutParams();
    layoutParams.topMargin = - verticalOffset;
    appBarLayout.setLayoutParams(layoutParams);

    if (toolbarOpen && progress >  toolbarThreshhold){
        constraintSet_closeToolbar.applyTo(constraintLayout);
        toolbarOpen = false;
    }
    else if (toolbarOpen && progress <  toolbarThreshhold){
        constraintSet_openToolbar.applyTo(constraintLayout);
        toolbarOpen = true;
    }
}

}

我在这一行中遇到错误(在 onOffsetChanged() 内)

AppBarLayout.LayoutParams layoutParams = (AppBarLayout.LayoutParams) 
      appBarLayout1.getLayoutParams();

【问题讨论】:

  • A ViewLayoutParams 是它的父类型,而不是它自己的类型。你的AppBarLayoutCoordinatorLayout 中,所以它有CoordinatorLayout.LayoutParams
  • 我尝试使用此代码 CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams)appBarLayout1.getLayoutParams();没有错误。谢谢@MikeM。

标签: android classcastexception android-appbarlayout layoutparams


【解决方案1】:

您需要使用CoordinatorLayoutLayoutParams,因为AppBarLayout 是布局xml 中CoordinatorLayout 的子代。

CoordinatorLayout.LayoutParams layoutParams = 
(CoordinatorLayout.LayoutParams) appBarLayout1.getLayoutParams();

【讨论】:

  • 这段代码给出了不兼容的类型。还有其他选择吗?
  • @KavinRajuS 我已经修复了Sander的答案不兼容的类型,现在检查一下
  • 糟糕,我的错。谢谢@VladyslavMatviienko。
  • 哦...好的会检查一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 2012-08-13
相关资源
最近更新 更多