2016-08-12 83 views
3

我有一个折叠的工具栏布局,其中包含一个图像和折叠显示工具栏的标题。我需要更改工具栏标题字体,所以我在工具栏布局中添加了一个textview。现在我收到以下错误生成重复每当我折叠工具栏。requestLayout()被CollapsingToolbarLayout错误地调用

08-12 13:14:19.604 2263-2263/com.panoroma.admin W/View: requestLayout() improperly called by android.support.design.widget.CollapsingToolbarLayout{2d353cd6 V.ED.... ........ 0,0-1080,390 #7f0c0070 app:id/collapsing_toolbar} during second layout pass: posting in next frame 
08-12 13:14:19.604 2263-2263/com.panoroma.admin W/View: requestLayout() improperly called by android.support.v7.widget.AppCompatTextView{1bb84b57 V.ED.... ........ 168,48-407,119 #7f0c0073 app:id/toolbar_title} during second layout pass: posting in next frame 

我的布局......

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

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

    <android.support.design.widget.CollapsingToolbarLayout 
     android:id="@+id/collapsing_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:contentScrim="?attr/colorPrimary" 
     app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed|exitUntilCollapsed"> 

     <ImageView 
      android:id="@+id/header" 
      android:layout_width="100dp" 
      android:layout_height="100dp" 
      android:adjustViewBounds="true" 
      android:layout_gravity="center" 
      android:scaleType="centerCrop" 
      android:layout_marginTop="15dp" 
      android:layout_marginBottom="15dp" 
      android:background="@drawable/dashboard80" 
      app:layout_collapseMode="parallax" 
      app:layout_collapseParallaxMultiplier="0.5" /> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/da_toolbar" 
      app:popupTheme="@style/AppTheme.PopupOverlay" 
      app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:app="http://schemas.android.com/apk/res-auto" 
      android:layout_width="match_parent" 
      app:layout_collapseMode="pin" 
      android:layout_height="?attr/actionBarSize"> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textSize="20sp" 
       android:textColor="?attr/colorAccent" 
       android:id="@+id/toolbar_title"/> 

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

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


<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_below="@+id/rel_dash_icon" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" > 

......................... 

</ScrollView> 

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

的java文件..

Typeface ubuntuC = Typeface.createFromAsset(getAssets(), "ubuntuC.ttf"); 
Toolbar toolbar = (Toolbar) findViewById(R.id.da_toolbar); 
    toolbar.setTitle(""); 
    setSupportActionBar(toolbar); 

    toolbar_title = (TextView)toolbar.findViewById(R.id.toolbar_title); 
    toolbar_title.setTypeface(ubuntuC); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
     getSupportActionBar().setHomeAsUpIndicator(getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha, null)); 
    else 
     getSupportActionBar().setHomeAsUpIndicator(getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha)); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    final CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar); 
    AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.appbar); 
    appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { 
     boolean isShow = false; 
     int scrollRange = -1; 

     @Override 
     public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
      if (scrollRange == -1) { 
       scrollRange = appBarLayout.getTotalScrollRange(); 
      } 
      if (scrollRange + verticalOffset == 0) { 
//     collapsingToolbarLayout.setTitle("Dashboard"); 
       toolbar_title.setText("Dashboard"); 
       isShow = true; 
      } else if(isShow) { 
//     collapsingToolbarLayout.setTitle(""); 
       toolbar_title.setText(""); 
       isShow = false; 
      } 
     } 
    }); 

我只想用一个中心图像,其上崩溃将显示标题的工具栏。标题将具有自定义字体。现在有没有更好的方法呢?

回答

1

实际上,您可以为折叠和展开模式设置标题颜色,当工具栏处于折叠状态时,它们将在两者之间转换。

在你的情况,而不是手动处理折叠/扩展和设置标题,你可以设置扩展的标题颜色为透明和折叠的标题颜色为你最初想要的东西。

所以,现在扩展时,工具栏标题是不可见的,当折叠时,工具栏标题是可见的。

+0

从哪里可以更改展开/折叠模式标题的颜色? –

3

我对我的onOffsetChangedListener有同样的问题。为了解决这个问题,我不得不将我的代码封装在UI线程上运行的runnable。 所以用你,你就必须做到以下几点:

@Override 
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
     getActivity().runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        if (scrollRange == -1) { 
         scrollRange = appBarLayout.getTotalScrollRange(); 
        } 
        if (scrollRange + verticalOffset == 0) { 
         collapsingToolbarLayout.setTitle("Dashboard"); 
         toolbar_title.setText("Dashboard"); 
         isShow = true; 
        } else if(isShow) { 
         collapsingToolbarLayout.setTitle(" "); 
         toolbar_title.setText(" "); 
         isShow = false; 
        } 
       } 
     }); 

注意,在和的setTitle的setText引号之间的空间。我相信你需要一个空间或者它不会工作。此外,请确保在您的xml中,您的CollapsingToolbarLayout上有您的

app:titleEnabled="false" 

。希望解决的问题:)

+4

不,我还是看到了大量的原木! – MohanRaj

1

我有同样的问题,而这个页面给了我一个提示:here

我删除了collapsingToolbarLayout.setTitle("Dashboard"); collapsingToolbarLayout.setTitle(" "); 和创建了两个样式styles.xml

<style name="CustomCollapsingCollapsed"> 
    <item name="android:textColor">@color/colorText</item> 
</style> 
<style name="CustomCollapsingExpanded"> 
    <item name="android:textColor">@color/transparent</item> 
</style> 

并在

中使用它们
<android.support.design.widget.CollapsingToolbarLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:contentScrim="@color/colorAccent" 
    app:layout_scrollFlags="scroll|exitUntilCollapsed" 
    app:expandedTitleTextAppearance="@style/CustomCollapsingExpanded" 
    app:collapsedTitleTextAppearance="@style/CustomCollapsingCollapsed" 
    > 

没有日志了...希望它有帮助!

-1
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { 
     boolean isShow = false; 
     int scrollRange = -1; 

     @Override 
     public void onOffsetChanged(final AppBarLayout appBarLayout, final int verticalOffset) { 
      if (scrollRange == -1) { 
       scrollRange = appBarLayout.getTotalScrollRange(); 
      } 
      if (scrollRange + verticalOffset == 0) { 
       if (mToolbarTitle.getVisibility() == View.GONE) { 
        mToolbarTitle.setVisibility(View.VISIBLE); 
        mCollapsingToolbarLayout.setTitle("昵称"); 
        mToolbarTitle.setText("昵称"); 
       } 
       isShow = true; 
      } else if (isShow) { 
       mToolbarTitle.setVisibility(View.GONE); 
       isShow = false; 
      } 
     } 
    }); 

。希望解决的问题

5

下面这段代码为我工作 上AppBarLayout添加postRunnable

mAppBar.addOnOffsetChangedListener(new AppBarStateChangeListener() { 
      @Override 
      public void onStateChanged(AppBarLayout appBarLayout, final int state, int done) { 
       mAppBar.post(new Runnable() { 
        @Override 
        public void run() { 
         if (state == COLLAPSED) { 
          mToolBarTitle.setText(model.getTitle()); 
         } else if (state == EXPANDED || state == IDLE) { 
          mToolBarTitle.setText(""); 
         } 
        } 
       }); 
      } 
     }); 
0

onOffsetChanged()叫了这么多次和Android抛出的警告因为您正在请求布局作为的一部分toolbar_title.setText("Dashboard");。你应该做的是,使用一个布尔标志,并且只在满足条件时调用它一次,或者检查工具栏文本视图的VISIBILITY标志,就像这样。

  1. 工具栏布局内CollapsingLayout

    < android.support.v7.widget.Toolbar 
        android:id="@+id/toolbar" 
        android:layout_width="match_parent" 
        android:layout_height="?attr/actionBarSize" 
        app:layout_collapseMode="pin" 
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"> 
    
         <TextView 
          android:id="@+id/toolbar_title" 
          style="@style/Toolbar.Title" 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:visibility="gone" 
          android:layout_gravity="center" /> 
    
        </android.support.v7.widget.Toolbar> 
    
  2. 下添加的TextView在您的活动或片段类中OnOffsetChangedListener()修改一些东西像下面的检查。这将停止警告。

    appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { 
        @Override 
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
        if (verticalOffset == toolbar.getHeight() - collapsingToolbarLayout.getHeight()) { 
    
         if (textView.getVisibility() != View.VISIBLE) { 
         textView.setVisibility(View.VISIBLE); 
         textView.setText(title); // show toolbar title 
         } 
        } else { 
         if (textView.getVisibility() != View.GONE) { 
         textView.setVisibility(View.GONE); // hide title bar 
         } 
        } 
        } 
    }); 
    

    }

相关问题