it-roy-ru.com

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

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

53
nomongo

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

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

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

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

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

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

getSupportActionBar().hide();

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

37
Philippe

Спрятать:

getSupportActionBar().hide();

Шоу:

getSupportActionBar().show();
24
Andrey

Ответ прост. Просто внедрите 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;
            }
        }
    };

Я получил идею от: https://stackoverflow.com/a/27063901/1079773

16
Abdul Rahman

Библиотека поддержки дизайна Android может быть использована для отображения/скрытия панели инструментов.

Смотрите это . http://Android-developers.blogspot.kr/2015/05/Android-design-support-library.html

И здесь есть подробные образцы . http://inthecheesefactory.com/blog/Android-design-support-library-codelab/en

8
hoi

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

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

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

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

https://youtu.be/mEGEVeZK7Nw

2
Jack

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

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


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

Я пытался реализовать то же поведение, вот основная часть кода, показывающая и скрывающая панель инструментов (поместите в любой класс, содержащий ваш 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));

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

1
Timwillhack

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

app:layout_scrollFlags="scroll|enterAlways"

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

1
Rishab

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

Это хорошо представлено в этом пост в блоге Android . В частности, «Разрушающаяся панель инструментов» - это то, что вы ищете.

0
Cristina De Rito

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

https://github.com/JohannBlake/JBHeaderScroll

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

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

Есть даже поддержка вложенных заголовков.

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

Эта библиотека не требует реализации какого-либо onScrollListener.

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

0
AndroidDev

Я реализовал служебный класс, чтобы сделать полную анимацию скрытия/показа панели инструментов при прокрутке. Вы можете увидеть статью здесь http://rylexr.tinbytes.com/2015/04/27/how-to-hideshow-Android-toolbar-when-scrolling-google-play-musics-behavior/ . Исходный код находится здесь https://github.com/rylexr/Android-show-hide-toolbar .

0
rylexr