Подтвердить что ты не робот

Панель инструментов 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

4b9b3361

Ответ 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