0

Ich versuche, 'Untertitel' von CollapsingToolbarLayout in meiner App mit dieser example hier zu setzen."java.lang.ClassCastException" beim Versuch, Untertitel eines CollapsingToolbarLayout zu setzen

Hier ist der Code aus onCreate() von 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"); 

Hier 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> 

Hier 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> 

Hier 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); 
    } 
} 

Hier 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; 
    } 

} 

Das Problem ist, dass ich diesen Fehler bin immer: 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 auf der Linie oben angegeben.

Warum bin ich diesen Fehler und , wie es zu zu lösen?

Bitte lassen Sie es mich wissen.

Antwort

2

Sie haben nicht auf Ihrem Code angezeigt, aber ich wette, dass Ihre header_view.xml eine LinearLayout als Stammansicht haben.

Also im Grunde, was passiert: die <include Code „wird ersetzt“ durch die LinearLayout an der Wurzel header_view.xml und Sie findViewById(R.id.toolbar_header_view) rufen Sie dann die zurückgibt, dass LinearLayout und dann mit der (HeaderView) Sie die VM doch sagen, dies ist ein HeaderView, aber es ist, es ist ein LinearLayout. Es stürzt also ab!

Die beste Option, ohne Stück Code sehen Sie es nicht zeigen, haben Sie eines der folgenden:

  1. <HeaderView> von header_view.xml an der Wurzel setzen,

oder wenn das nicht möglich ist weil es innerhalb header_view.xml

mehr Zeug
    Code
  1. Änderung der include und dann innerhalb des i zu finden nclude, um die eigentliche HeaderView zu finden.

Etwas wie:

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); 

beachten Sie, dass es findViewById zweimal aufruft. Eine für das Include und eine weitere für das HeaderView darin

Verwandte Themen