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

Панель инструментов lollipop для Android: как скрыть/показать панель инструментов при прокрутке?

Я использую новый виджет панели инструментов, представленный в appcompat/support-v7. Я хотел бы скрыть/показать панель инструментов в зависимости от того, будет ли пользователь прокручиваться вверх/вниз по странице, как в новом приложении Google playstore или в приложении NewsStand. Есть ли что-то встроенное в виджет панели инструментов для этого или я должен использовать его в сочетании с FrameLayout и ObservableScrollView?

4b9b3361

Ответ 1

Насколько я знаю, в этом нет ничего, что сделает это за вас. Однако вы можете посмотреть исходный код Google IO, особенно BaseActivity. Найдите "auto hide" или посмотрите onMainContentScrolled

Чтобы скрыть Toolbar, вы можете просто сделать что-то вроде этого:

toolbar.animate().translationY(-toolbar.getBottom()).setInterpolator(new AccelerateInterpolator()).start();

Если вы хотите снова показать его, вы вызываете:

toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator()).start();

Ответ 2

Чтобы скрыть панель инструментов, вы можете просто:

getSupportActionBar().hide();

Таким образом, вам просто нужно иметь прослушиватель прокрутки и скрыть панель инструментов, когда пользователь прокручивает!

Ответ 3

Скрыть

getSupportActionBar().hide();

Показать:

getSupportActionBar().show();

Ответ 4

Ответ прост. Просто реализуйте OnScrollListener и скройте/покажите свою панель инструментов в слушателе. Например, если у вас есть listview/recyclerview/gridview, следуйте примеру.

В вашем методе MainActivity Oncreate инициализируйте панель инструментов.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        if (toolbar != null) {
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
        }
}

И затем реализуем OnScrollListener

public RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
        boolean hideToolBar = false;
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            if (hideToolBar) {
                ((ActionBarActivity)getActivity()).getSupportActionBar().hide();
            } else {
                ((ActionBarActivity)getActivity()).getSupportActionBar().show();
            }
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            if (dy > 20) {
                hideToolBar = true;

            } else if (dy < -5) {
                hideToolBar = false;
            }
        }
    };

У меня появилась идея: fooobar.com/questions/117012/...

Ответ 6

На самом деле существует довольно много способов скрыть/показать панель инструментов при прокрутке содержимого. Один из способов - сделать это через библиотеку поддержки дизайна Android или, точнее, расположение координатора. сверхмощная компоновка фреймов.

В основном все, что вам нужно сделать, это иметь следующую структуру в вашем файле макета, и вы должны иметь возможность достичь желаемого результата.

<CoordinatorLayout>
   <AppBarLayout>
   </AppBarLayout>
   <NestedScrollView>
   </NestedScrollView>
</CoordinatorLayout>

Я действительно сделал видео, чтобы объяснить, как это можно сделать шаг за шагом. Не стесняйтесь проверить это и сообщите мне, если это поможет. Благодарю!:)

https://youtu.be/mEGEVeZK7Nw

Ответ 7

Я пытаюсь реализовать одно и то же поведение, вот основная черта кода, отображающая и скрывающая панель инструментов (помещаемая в любой класс, содержащий ваш RecyclerView):

int toolbarMarginOffset = 0

private int dp(int inPixels){
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, inPixels, getApplicationContext().getResources().getDisplayMetrics());
}

public RecyclerView.OnScrollListener onScrollListenerToolbarHide = new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        toolbarMarginOffset += dy;
        if(toolbarMarginOffset>dp(48)){
            toolbarMarginOffset = dp(48);
        }
        if(toolbarMarginOffset<0){
            toolbarMarginOffset = 0;
        }
        ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)toolbar.getLayoutParams();
        params.topMargin = -1*toolbarMarginOffset; 
        toolbar.setLayoutParams(params);
    }
};

Я включил функцию dp для преобразования из пикселей в dp, но, очевидно, установил ее в зависимости от высоты вашей панели инструментов. (замените dp (48) на свою высоту панели инструментов)

Где бы вы ни настраивали RecyclerView, включите это:

yourListView.setOnScrollListener(onScrollListenerToolbarHide);

Однако есть еще пара дополнительных проблем, если вы также используете SwipeRefreshLayout.

Мне пришлось установить marginTop первого элемента в адаптере для RecyclerView на высоту панели инструментов плюс исходное смещение. (Немного о хаке, который я знаю). Причина этого заключается в том, что я обнаружил, что если бы я изменил свой код выше, включив изменение marginTop в recyclerView при прокрутке, это было неудобно. Так, как я его преодолел. Итак, в основном настройте свой макет так, чтобы панель инструментов плавала поверх RecyclerView (обрезая ее). Что-то вроде этого (в onBindViewHolder вашего пользовательского адаптера RecyclerView):

 if(position==0){
     ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)holder.card.getLayoutParams();
     // params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
     params.topMargin = dp(10+48);
 }

И, наконец, поскольку существует большое смещение, круг обновления RecyclerViews будет обрезаться, поэтому вам нужно будет его компенсировать (обратно в onCreate вашего класса, содержащего RecyclerView):

swipeLayout.setProgressViewOffset(true,dp(48),dp(96));

Надеюсь, это поможет кому-то. Его первый подробный ответ, поэтому я надеюсь, что я был достаточно подробным.

Ответ 8

Чтобы скрыть меню для определенного фрагмента:

 setHasOptionsMenu(true); //Inside of onCreate in FRAGMENT:  


   @Override
   public void onPrepareOptionsMenu(Menu menu) {
       menu.findItem(R.id.action_search).setVisible(false);
   }

Ответ 9

Просто добавьте это свойство внутри своей панели инструментов и сделайте

app:layout_scrollFlags="scroll|enterAlways"

Не удивительно

Ответ 11

Здесь можно загрузить библиотеку и демоверсию с полным исходным кодом для прокрутки панелей инструментов или любого типа заголовка:

https://github.com/JohannBlake/JBHeaderScroll

Заголовочными заголовками могут быть панели инструментов, LinearLayouts, RelativeLayouts или любой вид, который вы используете для создания заголовка.

Прокручиваемой областью может быть любой тип содержимого прокрутки, включая ListView, ScrollView, WebView, RecyclerView, RelativeLayout, LinearLayout или все, что вы хотите.

Там даже поддерживаются вложенные заголовки.

Это действительно сложное обязательство синхронизировать заголовки (панели инструментов) и прокручиваемый контент так, как это было сделано в Google Newsstand.

В этой библиотеке не требуется реализовать какой-либо тип onScrollListener.

Решения, перечисленные выше другими, представляют собой только наполовину испеченные решения, которые не учитывают, что верхний край области прокручиваемого содержимого под панелью инструментов сначала должен быть выровнен с нижним краем панели инструментов, а затем при прокрутке область содержимого должна быть изменена и, возможно, изменена. JBHeaderScroll обрабатывает все эти проблемы.

Ответ 12

Существует Android-библиотека под названием Android Design Support Library, которая представляет собой удобную библиотеку, в которой вы можете найти все те материалы, которые придумывают дизайн материалов, которые представлены в документации материалов, не сообщая вам, как их выполнять.

Это хорошо представлено в этом сообщении в блоге Android. В частности, "Collapsing Toolbar" - это то, что вы ищете.

Ответ 14

Панель инструментов в API Material Design аналогична любому другому VIEW, используемому в Android...

попробуйте использовать:

toolbar.setVisibility(View.GONE);

это сработало для меня

Я еще не анимировал его, скрывая процесс. Ну, я думаю, что это можно сделать с помощью экземпляра Animator, так же, как анимировать простой View