2016-03-06 86 views
11

在我的應用程序中,我有一個摺疊工具欄。如果我開始一個特定的片段,我想摺疊工具欄,使其表現得像一個「正常」的,並且用戶不能自己花費。這是我的佈局,我用我的工具欄:工具欄向下滑動擴展

<android.support.design.widget.AppBarLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/appBarLayout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 

    <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:expandedTitleMarginEnd="64dp" 
     app:expandedTitleMarginStart="48dp" 
     app:titleEnabled="false" 
     app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

     <ImageView 
      android:src="@drawable/drawer_background" 
      app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" 
      android:layout_width="match_parent" 
      android:layout_height="172dp" 
      android:scaleType="centerCrop" 
      app:layout_collapseMode="parallax" 
      android:minHeight="100dp" /> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolBar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      app:layout_collapseMode="pin" 
      app:layout_scrollFlags="scroll|enterAlways" /> 

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

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

我還可以從代碼崩潰的佈局就像這樣:

appBarLayout.setExpanded(false, false); 

final AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) collapsingToolbarLayout.getLayoutParams(); 
params.setScrollFlags(0); 
collapsingToolbarLayout.setLayoutParams(params); 

但是,這並沒有幫助。如果用戶從工具欄向下滑動,它將展開。

你有什麼想法爲什麼?

+0

如何以編程方式設置'AppBarLayout'高度,以便它與工具欄的高度相匹配?這樣它就無處可拓。 – PPartisan

+0

佈局中的ImageView和Toolbar中的滾動標誌看起來很亂。嘗試刪除它們。 –

+0

@IlyaPolenov我將它們都更改爲'scroll | enterAlways',但這不會改變任何內容。你的意思是別的嗎? – Cilenco

回答

8

核心問題是到目前爲止還沒有CollapsingToolbarLayout.lock();方法(支持設計的v23.2.1)。希望這個功能將會包含在未來的版本中。在那之前,我建議採取以下解決辦法:

可以摺疊,並鎖定您的工具欄:

appbar.setExpanded(false,false); 
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams(); 
lp.height = (int) getResources().getDimension(R.dimen.toolbar_height); 

與解鎖:

CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams(); 
lp.height = (int) getResources().getDimension(R.dimen.nav_header_height); 

然而,上述代碼問題發生:

當強制合攏CoordinatorLayout我們的工具欄的標題消失了,CollapsingToolbarLayout.setTitle(CharSequence title);不再有效。爲了解決這個問題,我們在我們的工具欄中添加了一個TextView並相應地處理其可見性。 (我們希望有它的工具欄片段也「水漲船高」「解鎖」和「看得見的」在具有其工具欄片段「鎖定」。

我們必須設置的TextView的android:textAppearance要與CollapsingToolbarLayout的app:collapsedTitleTextAppearance相同的保持一致並避免用不同的工具欄文字大小和顏色來中斷用戶。

總之,像這樣的接口:

public interface ToolbarManipulation { 
    void collapseToolbar(); 
    void expandToolbar(); 
    void setTitle(String s); 
} 

implemantations這樣的:

@Override 
    public void collapseToolbar(){ 
     appbar.setExpanded(false,false); 
     CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams(); 
     lp.height = (int) getResources().getDimension(R.dimen.toolbar_height); 
     toolbarCollapsedTitle.setVisibility(View.VISIBLE); 
    } 

    @Override 
    public void expandToolbar() { 
     CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams(); 
     lp.height = (int) getResources().getDimension(R.dimen.nav_header_height); 
     toolbarCollapsedTitle.setVisibility(View.GONE); 
    } 

    @Override 
    public void setTitle(String s) { 
     collapsingToolbarLayout.setTitle(s); 
     toolbarCollapsedTitle.setText(s); 
     collapsingToolbarLayout.invalidate(); 
     toolbarCollapsedTitle.invalidate(); 
    } 

和主這樣的XML:

.... 
    <android.support.design.widget.CollapsingToolbarLayout 
      android:id="@+id/collapsing_toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:fitsSystemWindows="true" 
      app:contentScrim="?attr/colorPrimary" 
      app:layout_scrollFlags="scroll|exitUntilCollapsed" 
      app:collapsedTitleTextAppearance="@style/CollapsedAppBar" 

      > 
       <android.support.v7.widget.Toolbar 
        android:id="@+id/toolbar" 
        android:layout_width="match_parent" 
        android:layout_height="?attr/actionBarSize" 
        android:background="?attr/colorPrimary" 
        app:layout_collapseMode="pin" 
        app:popupTheme="@style/AppTheme.PopupOverlay" 
        > 
        <TextView 
         android:layout_width="match_parent" 
         android:layout_height="?attr/actionBarSize" 
         android:visibility="gone" 
         android:layout_gravity="center_vertical|start" 
         android:gravity="center_vertical|start" 
         android:id="@+id/toolbar_collapsed_title" 
         android:textAppearance="@style/CollapsedAppBar" 
         /> 
       </android.support.v7.widget.Toolbar> 
     </android.support.design.widget.CollapsingToolbarLayout> 
...... 

您可以鎖定和解鎖工具欄,只要你喜歡。你的片段應該在他們的onResume()中調用這些函數。

我已經上傳了一個示例實現here

注意:這只是一種解決方法,顯然不是最乾淨的解決方案。我們正在等待更新版本的com.android.support來解決這個問題。

+1

很好,謝謝你這個偉大的答案。我希望有人提到支持庫和他們的限制,所以謝謝你的詳細解答! – Cilenco

+0

什麼是默認toolbar_height? @Sevle – Sid

+0

48dp爲橫向和56dp爲縱向,來源:https://www.google.com/design/spec/layout/metrics-keylines.html – Sevle

9

我不能完全肯定,如果這是你在找什麼

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams(); 
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior(); 
behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() { 
    @Override 
    public boolean canDrag(@NonNull AppBarLayout appBarLayout) { 
     return false; 
    } 
}); 
2

嘗試改變AppBar的高度。這個對我有用。

public void lockAppBar() { 
    int appbarHeight = (int)getResources().getDimension(R.dimen.your_fixed_appbar_height); 
    getView().findViewById(R.id.my_appbar).getLayoutParams().height = appbarHeight; 
} 
1

那麼嘗試設置一些參數,工具欄,tabLayout編程,我對使用onPageSelected(INT)ViewPager改變標誌

 @Override 
     public void onPageSelected(int position) { 
      AppBarLayout.LayoutParams params = new AppBarLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
      if (position == 3) {//listen for scrolls only for Fragment 3 
       params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS); 
       toolBar.setLayoutParams(params);//hide as per scroll 
       params = new AppBarLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
       params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS); 
       tabLayout.setLayoutParams(params);//always visible 
      } else { 
       appBarLayout.setExpanded(false, true); 
       params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED); 
       toolBar.setLayoutParams(params);//don't listen to scrolls 
       tabLayout.setLayoutParams(params);//dont listen to scrolls 
      } 
     } 

使用/設置上述標誌,你需要的。 AppBarLayout.LayoutParams

Happy_Coding;

2

findViewById(R.id.image_view).setVisibility(View.GONE);其中image_view的ImageView摺疊式工具的ID。但是,如果你想爲特定的片段做它,我建議使用片段活動通信調用相同的片段。

2

提供的解決方案沒有爲我工作,除了這一個。有了這個解決方案,我可以輕鬆管理摺疊工具欄的狀態。這將防止展開/啓用摺疊工具欄的摺疊以及爲其設置標題。

public void lockAppBar(boolean locked,String title) { 
    if(locked){ 
     appBarLayout.setExpanded(false, true); 
     int px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 80, getResources().getDisplayMetrics()); 
     CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appBarLayout.getLayoutParams(); 
     lp.height = px; 
     appBarLayout.setLayoutParams(lp); 
     collapsingToolbarLayout.setTitleEnabled(false); 
     toolbar.setTitle(title); 
    }else{ 
     appBarLayout.setExpanded(true, false); 
     appBarLayout.setActivated(true); 
     CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams(); 
     lp.height = (int) getResources().getDimension(R.dimen.toolbarExpandHeight); 
     collapsingToolbarLayout.setTitleEnabled(true); 
     collapsingToolbarLayout.setTitle(title); 
    } 

}