0

我試圖在我的應用程序中使用此example這裏設置CollapsingToolbarLayout的'子標題'。在試圖設置CollapsingToolbarLayout的字幕時獲取'java.lang.ClassCastException'

下面的代碼從onCreate()Profile.java

CollapsingToolbarLayout collapsingToolbarLayout; 
    Toolbar toolbar; 
    HeaderView toolbarHeaderView; 
    HeaderView floatHeaderView; 

    collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapse_toolbar); 

    // error on the line below 
    toolbarHeaderView = (HeaderView) findViewById(R.id.toolbar_header_view); 
    floatHeaderView = (HeaderView) findViewById(R.id.float_header_view); 

    toolbarHeaderView.bindTo("title", "subtitle"); 
    floatHeaderView.bindTo("title", "subtitle"); 

這裏的activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
    android:id="@+id/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="com.abc.zzz.Profile"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appBarLayout" 
     android:layout_width="match_parent" 
     android:layout_height="256dp" 
     android:theme="@style/AppTheme.AppBarOverlay" 
     android:fitsSystemWindows="true"> 

     <android.support.design.widget.CollapsingToolbarLayout 
      android:id="@+id/collapse_toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      app:layout_scrollFlags="scroll|exitUntilCollapsed" 
      app:contentScrim="@color/colorPrimary" 
      android:fitsSystemWindows="true" 
      app:popupTheme="@style/AppTheme.PopupOverlay"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       app:layout_collapseMode="parallax"> 

       <include 
        android:id="@+id/toolbar_header_view" 
        layout="@layout/header_view" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:layout_marginRight="@dimen/header_view_end_margin_right" 
        android:layout_marginEnd="@dimen/header_view_end_margin_right" 
        android:visibility="gone" 
        /> 

      </android.support.v7.widget.Toolbar> 

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

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

    <include 
     android:id="@+id/float_header_view" 
     layout="@layout/header_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_behavior="com.abc.zzz.ViewBehavior"/> 

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

這裏的header_view.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 

    <!-- Title --> 
    <TextView 
     android:id="@+id/header_view_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="@android:color/white" 
     android:textSize="18sp" 
     /> 

    <!-- Subtitle --> 
    <TextView 
     android:id="@+id/header_view_sub_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="@android:color/white" 
     android:textSize="16sp" 
     /> 

</LinearLayout> 

這裏的HeaderView.java

public class HeaderView extends LinearLayout { 

    TextView title; 

    TextView subTitle; 

    public HeaderView(Context context) { 
     super(context); 
    } 

    public HeaderView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public HeaderView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public HeaderView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 


    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 
     title = (TextView) findViewById(R.id.header_view_title); 
     subTitle = (TextView) findViewById(R.id.header_view_sub_title); 
    } 

    public void bindTo(String title) { 
     bindTo(title, ""); 
    } 

    public void bindTo(String title, String subTitle) { 
     hideOrSetText(this.title, title); 
     hideOrSetText(this.subTitle, subTitle); 
    } 

    private void hideOrSetText(TextView tv, String text) { 
     if (text == null || text.equals("")) 
      tv.setVisibility(GONE); 
     else 
      tv.setText(text); 
    } 
} 

這裏的ViewBehavior.java

public class ViewBehavior extends CoordinatorLayout.Behavior<HeaderView> { 

    private Context mContext; 

    private int mStartMarginLeft; 
    private int mEndMargintLeft; 
    private int mMarginRight; 
    private int mStartMarginBottom; 
    private boolean isHide; 

    public ViewBehavior(Context context, AttributeSet attrs) { 
     mContext = context; 
    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, HeaderView child, View dependency) { 
     return dependency instanceof AppBarLayout; 
    } 

    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, HeaderView child, View dependency) { 
     shouldInitProperties(child, dependency); 

     int maxScroll = ((AppBarLayout) dependency).getTotalScrollRange(); 
     float percentage = Math.abs(dependency.getY())/(float) maxScroll; 

     float childPosition = dependency.getHeight() 
       + dependency.getY() 
       - child.getHeight() 
       - (getToolbarHeight() - child.getHeight()) * percentage/2; 


     childPosition = childPosition - mStartMarginBottom * (1f - percentage); 

     CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) child.getLayoutParams(); 
     lp.leftMargin = (int) (percentage * mEndMargintLeft) + mStartMarginLeft; 
     lp.rightMargin = mMarginRight; 
     child.setLayoutParams(lp); 

     child.setY(childPosition); 

     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { 
      if (isHide && percentage < 1) { 
       child.setVisibility(View.VISIBLE); 
       isHide = false; 
      } else if (!isHide && percentage == 1) { 
       child.setVisibility(View.GONE); 
       isHide = true; 
      } 
     } 
     return true; 
    } 

    private void shouldInitProperties(HeaderView child, View dependency) { 

     if (mStartMarginLeft == 0) 
      mStartMarginLeft = mContext.getResources().getDimensionPixelOffset(R.dimen.header_view_start_margin_left); 

     if (mEndMargintLeft == 0) 
      mEndMargintLeft = mContext.getResources().getDimensionPixelOffset(R.dimen.header_view_end_margin_left); 

     if (mStartMarginBottom == 0) 
      mStartMarginBottom = mContext.getResources().getDimensionPixelOffset(R.dimen.header_view_start_margin_bottom); 

     if (mMarginRight == 0) 
      mMarginRight = mContext.getResources().getDimensionPixelOffset(R.dimen.header_view_end_margin_right); 

    } 


    public int getToolbarHeight() { 
     int result = 0; 
     TypedValue tv = new TypedValue(); 
     if (mContext.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) { 
      result = TypedValue.complexToDimensionPixelSize(tv.data, mContext.getResources().getDisplayMetrics()); 
     } 
     return result; 
    } 

} 

問題是,我得到這個錯誤:java.lang.RuntimeException: Unable to start activity ComponentInfo{com.abc.zzz/com.abc.zzz.Profile}: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to com.abc.zzz.HeaderView上面指定的行。

爲什麼我收到此錯誤和如何解決呢?

請讓我知道。

回答

2

你沒有顯示你的代碼,但我敢打賭,你的header_view.xml有一個LinearLayout作爲根視圖。

所以基本上會發生什麼情況是:<include代碼在header_view.xml根「被替換」由LinearLayout然後調用findViewById(R.id.toolbar_header_view)它返回LinearLayout然後用(HeaderView)你告訴虛擬機,這是一個HeaderView,但它是一個LinearLayout。所以它崩潰!

沒有看到一段代碼,你並沒有表現出來,最好的選擇是下列之一:

  1. <HeaderView>header_view.xml根,

,或者如果這是不可能的因爲裏面有更多的東西header_view.xml

  1. 更改您的代碼以找到include然後在i nclude,找到實際的HeaderView。

喜歡的東西:

toolbarHeaderView = (HeaderView) findViewById(R.id.toolbar_header_view).findViewById(R.id.header_view_id); 
floatHeaderView = (HeaderView) findViewById(R.id.float_header_view).findViewById(R.id.header_view_id); 

注意,它調用findViewById兩次。一個用於包含另一個用於HeaderView的內部它

相關問題