Панель инструментов расширяется при ударе
В моем приложении у меня сворачивается панель инструментов. Если я запустил определенный фрагмент, я хочу свернуть панель инструментов, чтобы он вел себя как "нормальный", и пользователь не может расходовать его самостоятельно. Вот мой макет, который я использую для моей панели инструментов:
<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);
Но это не помогает. Если пользователь переместится с панели инструментов, он будет расширяться.
Есть ли у вас какие-либо идеи?
Ответы
Ответ 1
Основная проблема заключается в том, что до сих пор нет метода 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);
Однако с приведенным выше кодом возникает проблема:
когда принудительно сжимается Координатор. Если заголовок нашей панели инструментов не исчез, а CollapsingToolbarLayout.setTitle(CharSequence title);
больше не работает. Чтобы исправить это, мы добавляем TextView в панель инструментов и соответствующим образом управляем его видимостью. (мы хотим, чтобы он "ушел" в фрагмент, который имеет панель инструментов "разблокирована" и "видима" во фрагменте, который имеет свою панель инструментов "заблокирован".
Мы должны установить TextView android:textAppearance
одинаково с CollapsingToolbarLayout app:collapsedTitleTextAppearance
, чтобы быть последовательными и не нарушать пользователя с различными размерами и цветами текста панели инструментов.
Итак, с таким интерфейсом:
public interface ToolbarManipulation {
void collapseToolbar();
void expandToolbar();
void setTitle(String s);
}
такие как:
@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();
Я загрузил пример реализации здесь.
Примечание. Это всего лишь обходное решение и, очевидно, не самое чистое решение. Мы ожидаем более новой версии com.android.support, чтобы решить эту проблему.
Ответ 2
Я не совсем уверен, что это то, что вы ищете
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;
}
});
Ответ 3
Попробуйте изменить высоту AppBar. Это работает для меня.
public void lockAppBar() {
int appbarHeight = (int)getResources().getDimension(R.dimen.your_fixed_appbar_height);
getView().findViewById(R.id.my_appbar).getLayoutParams().height = appbarHeight;
}
Ответ 4
Do findViewById(R.id.image_view).setVisibility(View.GONE);
где image_view
- это идентификатор imageView на панели инструментов .. Но если вы хотите сделать это для определенного фрагмента, я предлагаю позвонить то же самое с использованием обмена фрагментацией активности.
Ответ 5
Ни один из предоставленных решений не работал у меня, кроме этого. С помощью этого решения я могу легко управлять состоянием сворачиваемой панели инструментов. Это предотвратит развёртывание/включение свертывания сворачиваемой панели инструментов и установку для него названия.
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);
}
}
Ответ 6
Ну попробуйте установить некоторые параметры в toolBar, tabLayout программно, у меня есть ViewPager
изменение флагов onPageSelected (int)
@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;