Панель инструментов Android + вкладка Layout + Drawer, Скрыть панель инструментов и прокрутить TabLayout вверх
У меня есть активность, к которой прикреплен ящик. Каждое меню ящика является фрагментом, и под одним из меню у меня есть фрагмент с TabLayout
, и каждая вкладка содержит RecyclerView
.
Итак, теперь, когда я прокручиваю RecyclerView
, макет вкладки скрывается, но ToolBar
остается наверху. Мне нужно ToolBar
скрыться (scrollFlags:scroll|enterAlways
), а TabLayout
должно отображаться вверху.
Итак, текущая настройка:
Activity with attached DrawerLayout
-> Fragment with TabLayout
-> Tab Fragment 1 with RecyclerView
-> Tab Fragment 2 with RecyclerView
Ответы
Ответ 1
Меньше кода более эффективен
Здравствуйте, @Vishal, я нашел слишком много для вас. потому что я также ищу эту тему до некоторого времени.
Я нашел одну блестящую библиотеку с именем MaterialViewPager, это полностью настраивается с тем, что вы хотите скрыть в прокрутке режим.
Смотрите видео на https://www.youtube.com/watch?v=r95Tt6AS18c
![введите описание изображения здесь]()
Ответ 2
Можете ли вы использовать библиотеку дизайна поддержки? Он имеет такое поведение, чтобы сделать то, что вы описали. Для этого используется CoordinatorLayout.
<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:animateLayoutChanges="true"
>
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<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_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<android.support.design.widget.TabLayout
android:id="@+id/tabanim_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/tabanim_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_alarm_add_white_48dp"
app:layout_anchor="@id/tabanim_viewpager"
app:layout_anchorGravity="bottom|right|end"
android:layout_margin="16dp"
/>
</android.support.design.widget.CoordinatorLayout>
Ответ 3
Сначала вам нужно реализовать прослушиватель прокрутки. Здесь вы можете найти пример HidingScrollListener.
public abstract class HidingScrollListener extends RecyclerView.OnScrollListener {
private static final float HIDE_THRESHOLD = 10;
private static final float SHOW_THRESHOLD = 70;
private int mToolbarOffset = 0;
private boolean mControlsVisible = true;
private int mToolbarHeight;
private int mTotalScrolledDistance;
private int previousTotal = 0;
private boolean loading = true;
private int visibleThreshold = 4;
int firstVisibleItem, visibleItemCount, totalItemCount;
private LinearLayoutManager layoutManager;
public HidingScrollListener(Context context, LinearLayoutManager layoutManager) {
mToolbarHeight = Tools.getToolbarHeight(context);
this.layoutManager = layoutManager;
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
if (mTotalScrolledDistance < mToolbarHeight) {
setVisible();
} else {
if (mControlsVisible) {
if (mToolbarOffset > HIDE_THRESHOLD) {
setInvisible();
} else {
setVisible();
}
} else {
if ((mToolbarHeight - mToolbarOffset) > SHOW_THRESHOLD) {
setVisible();
} else {
setInvisible();
}
}
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
clipToolbarOffset();
onMoved(mToolbarOffset);
if ((mToolbarOffset < mToolbarHeight && dy > 0) || (mToolbarOffset > 0 && dy < 0)) {
mToolbarOffset += dy;
}
if (mTotalScrolledDistance < 0) {
mTotalScrolledDistance = 0;
} else {
mTotalScrolledDistance += dy;
}
// for load more
visibleItemCount = recyclerView.getChildCount();
totalItemCount = layoutManager.getItemCount();
firstVisibleItem = layoutManager.findFirstVisibleItemPosition();
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
// End has been reached
// Do something
loading = true;
onLoadMore();
}
}
private void clipToolbarOffset() {
if (mToolbarOffset > mToolbarHeight) {
mToolbarOffset = mToolbarHeight;
} else if (mToolbarOffset < 0) {
mToolbarOffset = 0;
}
}
private void setVisible() {
if (mToolbarOffset > 0) {
onShow();
mToolbarOffset = 0;
}
mControlsVisible = true;
}
private void setInvisible() {
if (mToolbarOffset < mToolbarHeight) {
onHide();
mToolbarOffset = mToolbarHeight;
}
mControlsVisible = false;
}
public abstract void onMoved(int distance);
public abstract void onShow();
public abstract void onHide();
public abstract void onLoadMore();
}
Чем вам нужно изменить адаптер RecyclerView. Вам нужно добавить пустой вид вверху вашего RecyclerView так высоко, как ваш Tolbar.
Вот пример макета для вашего пустого представления.
<?xml version="1.0" encoding="utf-8"?>
<View xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="@dimen/abc_action_bar_default_height_material" />
Чем вам необходимо переопределить методы getItemViewType и getITemCount адаптера, как показано ниже.
@Override
public int getItemViewType(int position) {
if (isPositionHeader(position)) {
return TYPE_HEADER;
}
return TYPE_ITEM;
}
private boolean isPositionHeader(int position) {
return position == 0;
}
@Override
public int getItemCount() {
return mObjects.size() + 1;
}
Затем в адаптере onCreateViewHolder метод вернет правильную компоновку для вашей позиции RecyclerView ниже:
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = null;
switch (viewType) {
case TYPE_HEADER:
view = LayoutInflater.from(mContext).inflate(R.layout.layout_recycler_header, parent, false);
return new RecyclerHeaderViewHolder(view);
default:
view = LayoutInflater.from(mContext).inflate(R.layout.row_recyclerview_category, parent, false);
return new ViewHolder(view);
}
}
И, наконец, добавьте реализацию HidingScrollListener в ваш RecyclerView, как показано ниже:
final int mToolbarHeight = Tools.getToolbarHeight(getActivity());
RecyclerView mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerview);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(linearLayoutManager);
mRecyclerView.setAdapter(mAdapter);
mViewPager.setPadding(mRecyclerView.getPaddingLeft(),
mToolbarHeight,
mRecyclerView.getPaddingRight(),
mRecyclerView.getPaddingBottom());
mHidingScrollListener = new HidingScrollListener(getActivity(), linearLayoutManager) {
@Override
public void onMoved(int distance) {
mToolbarContainer.setTranslationY(-distance);
}
@Override
public void onShow() {
mToolbarContainer.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start();
}
@Override
public void onHide() {
mToolbarContainer.animate()
.translationY(-mToolbarHeight)
.setInterpolator(new AccelerateInterpolator(2))
.start();
}
@Override
public void onLoadMore() {
}
};
mRecyclerView.setOnScrollListener(mHidingScrollListener);
Надеюсь, я правильно понимаю вашу проблему, и моя реализация может помочь вам.
Удачи.
Изменить: вы можете легко реализовать реализацию LoadMore и PullToRefresh для этого решения. Вы можете добавить свой запрос api в loadMore. Там трижды в PullToRefresh. После того, как вы потянете, чтобы обновить, очистите свои данные и сообщите об этом адаптеру, не забудьте установить visibleItemCount и totalItemCount в 0 в вашей реализации прокрутки скрытия. Если вы не установите значение 0, после обновления вашего груза больше не будет работать должным образом. Вы будете получать меньше данных в качестве количества элементов в вашей разбивке на страницы.
Ответ 4
Вы можете показать нам свой xml-код, если вы хотите найти свои ошибки,
ниже мой кодовый раздел для тех, кто хочет реализовать панель инструментов, ящик, вкладку и RecycleView в приложении theri.
https://github.com/Gujarats/Android-Toolbar-Drawer-tab-recyvleview-
Надеюсь, что это поможет
Ответ 5
Вы можете попробовать следующее, которое я использовал, чтобы скрыть панель инструментов, и заставить scrollview отобразить весь экран для полного просмотра страницы в моем дизайне приложения.
Это выглядит следующим образом.
- Скрыть панель инструментов.
- Получите ширину экрана телефона и высоту.
- Сохраните расположение вкладки Высота и ширина во временную переменную.
- Назначьте ширину экрана телефона и высоту в макете вкладки.
Это можно сделать следующим образом:
getSupportActionBar().hide();
int mwidth = getApplicationContext().getResources().getDisplayMetrics().widthPixels;
int mheight = getApplicationContext().getResources().getDisplayMetrics().heightPixels;
temp = (TabLayout) myfrag.getActivity().findViewById(R.id.TabLayout_genesis);
int getwidth = temp.getWidth();
int getheight = temp.getHeight();
temp.setMinimumHeight(mheight);
temp.setMinimumWidth(mwidth);
Надеюсь, это поможет.
Ответ 6
Everyone is giving the code, "Talk is cheap, show me the code" right.
I prefer not showing the code this time.
I will talk. I do not recommand such a complicated activity.
DrawerLayout и TabLayout - 2 основных метода навигации для Android. DrawerLayout и TabLayout, показанные в одном и том же действии, против гильдии развития Android. И если вы сделаете так, ваше приложение будет очень сложно использовать.
Представьте себе, что если пользователь совершает правый левый салфетки, вы должны провести пальцем по экрану pagerview или drawerlayout? Я вижу, что вы можете применить жестов салфетки к drawerlayout, когда пользователь переместится с правой стороны операции, иначе вы можете применить жест к pagerview, но как вы убедитесь, что пользователь знает это правило?
Даже пользователи знают, как прокручивать вашу активность (пользователи могут иметь смысл в наше время), ваше приложение по-прежнему выглядит очень сложным.
Мое предложение:
if you have less than 5 main menus, just use tablayout + actionbar,
if you have more than 5 main menus, use drawerlayout + actionbar.
you don't have to use both navigation in a row, you can still place the important actions to the actionbar right.
Ответ 7
Насколько я знаю, в этом нет ничего, что сделает это за вас. Однако вы можете посмотреть исходный код Google IO, особенно BaseActivity. Найдите "auto hide" или посмотрите onMainContentScrolled
Чтобы скрыть панель инструментов, вы можете просто сделать что-то вроде этого:
toolbar.animate().translationY(-toolbar.getBottom()).setInterpolator(new AccelerateInterpolator()).start();
Если вы хотите снова показать его, вы вызываете:
toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator()).start();
Найдено здесь: панель инструментов lollipop для Android: как скрыть/показать панель инструментов при прокрутке?
Ответ 8
У меня была такая же архитектура в моем приложении, как и я:
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/coordinator"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
>
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/main_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/chat_primary_color"
app:layout_scrollFlags="scroll|enterAlways"
android:elevation="4dp"/>
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:elevation="6dp"
android:minHeight="?attr/actionBarSize"
android:layout_below="@id/main_toolbar"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_below="@id/appbar_layout"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
/>
<android.support.v4.widget.NestedScrollView
android:id="@+id/container_fragment"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_below="@id/appbar_layout"
android:fillViewport="true"
android:foregroundGravity="center"
app:layout_behavior=".FixedScrollingViewBehavior"
/>
ViewPager, используемый для вкладок и NestedScrollView, используемый как FrameLayout для другого фрагмента, я показываю ViewPager для фрагментов, которым нужны вкладки, и я скрываю NestedScrollView в другом случае.
Здесь вы можете найти поведение для NestedScrollView FixedScrollingViewBehavior
Ответ 9
Чтобы скрыть панель инструментов в любое время, вы можете использовать:
getSupportActionBar().hide();
для более подробного объяснения url1 или url2