android lollipop toolbar: comment cacher / afficher la barre d'outils en faisant défiler?
j'utilise le nouveau widget toolbar introduit dans l'appcompat / support-v7. Je voudrais cacher/afficher la barre d'outils selon si l'utilisateur est en train de parcourir la page, comme dans l'application playstore de Google ou l'application NewsStand. Est-ce que quelque chose est intégré dans le widget de la barre d'outils pour cela ou devrais-je l'utiliser en conjonction avec FrameLayout et ObservableScrollView?
13 réponses
pour autant que je sache, il n'y a rien de construit qui fasse cela pour vous. Toutefois, vous pouvez jeter un oeil au code source Google IO, en particulier le BaseActivity . Rechercher "auto hide" ou regarder onMainContentScrolled
pour cacher le Toolbar
vous pouvez faire quelque chose comme ceci:
toolbar.animate().translationY(-toolbar.getBottom()).setInterpolator(new AccelerateInterpolator()).start();
si vous voulez le montrer à nouveau vous appelez:
toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator()).start();
pour cacher la barre d'outils vous pouvez juste faire:
getSupportActionBar().hide();
donc vous avez juste à avoir un lecteur de parchemin et cacher la barre d'outils lorsque l'utilisateur fait défiler !
Cacher:
getSupportActionBar().hide();
Spectacle:
getSupportActionBar().show();
La réponse est simple. Il suffit d'implémenter OnScrollListener
et de cacher/afficher votre barre d'outils dans l'écouteur. Par exemple, si vous avez listview/recyclerview/gridview, suivez l'exemple.
dans votre méthode MainActivity Oncreate
, initialisez la barre d'outils.
@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);
}
}
puis mettre en œuvre le 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;
}
}
};
j'ai eu l'idée de: https://stackoverflow.com/a/27063901/1079773
bibliothèque de soutien de conception Android peut être utilisé pour afficher/cacher la barre d'outils.
voir ceci. http://android-developers.blogspot.kr/2015/05/android-design-support-library.html
et il y a des échantillons de détail ici. http://inthecheesefactory.com/blog/android-design-support-library-codelab/en
il y a en fait un certain nombre de façons de cacher/afficher la barre d'outils pendant que vous faites défiler le contenu. Une des façons est de le faire via la bibliothèque de soutien de conception Android ou plus spécifiquement Layout Coordinateur aka. doté de super-pouvoirs cadre de mise en page.
Fondamentalement, tout ce que vous devez faire est d'avoir la structure suivante dans votre fichier de mise en page et vous devriez être en mesure d'atteindre le résultat que vous souhaitez.
<CoordinatorLayout>
<AppBarLayout>
</AppBarLayout>
<NestedScrollView>
</NestedScrollView>
</CoordinatorLayout>
j'ai fait une vidéo pour expliquer comment il peut être fait dans une étape par étape manière. N'hésitez pas à consulter et laissez-moi savoir si cela aide. Merci! :)
j'ai essayé d'implémenter le même comportement, voici le plus gros du code montrant et cachant la barre d'outils (mettre dans n'importe quelle classe contenant votre 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);
}
};
j'ai inclus la fonction dp pour convertir des pixels en dp mais évidemment la mettre à n'importe quelle hauteur de votre barre d'outils est. (remplacer dp (48) par votre hauteur de barre d'outils)
où que vous mettiez en place votre RecyclerView incluez ceci:
yourListView.setOnScrollListener(onScrollListenerToolbarHide);
Cependant, il y a quelques problèmes supplémentaires si vous utilisez également un SwipeRefreshLayout.
j'ai dû régler le bord supérieur du premier élément de L'adaptateur pour le RecyclerView à la hauteur de la barre d'outils plus le déport d'origine. (Un peu d'un hack, je sais). La raison en est que j'ai découvert que si je changeais mon code ci-dessus pour inclure le fait de changer le bord du recyclerView pendant le scrolling, c'était une expérience stressante. Donc, c'est comment j'ai surmonté. Donc, fondamentalement, le programme d'installation de votre layout de sorte que votre barre d'outils est flottante sur le dessus du RecyclerView (clipping it) quelque chose comme ceci (dans onBindViewHolder de votre adaptateur RecyclerView personnalisé):
if(position==0){
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)holder.card.getLayoutParams();
// params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
params.topMargin = dp(10+48);
}
et enfin, puisqu'il y a un grand offset, le cercle de rafraîchissement RecyclerViews sera clippé, donc vous aurez besoin de l'offset (de retour dans onCreate of your class holding your RecyclerView):
swipeLayout.setProgressViewOffset(true,dp(48),dp(96));
j'espère que cela aidera quelqu'un. Sa ma première réponse détaillée, donc j'espère que j'ai été assez détaillé.
pour masquer le menu d'un fragment particulier:
setHasOptionsMenu(true); //Inside of onCreate in FRAGMENT:
@Override
public void onPrepareOptionsMenu(Menu menu) {
menu.findItem(R.id.action_search).setVisible(false);
}
il suffit d'ajouter cette propriété à l'intérieur de votre barre d'outils et son fait
app:layout_scrollFlags="scroll|enterAlways"
N'est-ce pas, c'est génial
j'ai implémenté une classe utilitaire pour faire toute l'animation de la barre d'outils hide/show lors du défilement. Vous pouvez voir l'article ici http://rylexr.tinbytes.com/2015/04/27/how-to-hideshow-android-toolbar-when-scrolling-google-play-musics-behavior / . Le code Source est ici https://github.com/rylexr/android-show-hide-toolbar .
une bibliothèque et une démo avec le code source complet pour les barres d'outils de défilement ou tout type d'en-tête peuvent être téléchargés ici:
https://github.com/JohannBlake/JBHeaderScroll
Les en-têtespeuvent être des barres D'outils, des scénarios linéaires, des scénarios relatifs, ou n'importe quel type de vue que vous utilisez pour créer un en-tête.
la zone de scrollable peut être n'importe quel type de contenu de scroll y compris ListView, ScrollView, WebView, RecyclerView, RelativeLayout, LinearLayout ou ce que vous voulez.
il y a même du soutien pour les en-têtes emboîtés.
il est en effet une entreprise complexe de synchroniser les en-têtes (barres d'outils) et le contenu scrollable la façon dont il est fait dans Google Newsstand.
cette bibliothèque ne nécessite pas la mise en œuvre de n'importe quelle sorte d'onscrollistener.
les solutions énumérées ci-dessus par d'autres ne sont que des solutions à moitié cuites qui ne tenir compte du fait que le bord supérieur de la zone de contenu compressible sous la barre d'outils doit d'abord être aligné sur le bord inférieur de la barre d'Outils, puis lors du défilement de la zone de contenu doit être repositionné et peut-être redimensionné. Le JBHeaderScroll s'occupe de toutes ces questions.
Il ya une bibliothèque Android appelé Android Design Support Library qui est une bibliothèque pratique où vous pouvez trouver de tous ces matériaux de conception Fantaisie choses que la documentation présente sans vous dire comment les faire.
C'est bien présenté dans ce Android Blog . La" barre D'outils qui S'effondre " en particulier est ce que vous cherchez.
barre d'outils dans la conception des matériaux API est tout comme les autres voir utilisé dans Android...
essayez d'utiliser:
toolbar.setVisibility(View.GONE);
cela a fonctionné pour moi
Je n'ai pas encore animé son processus de dissimulation. Eh bien je pense que cela peut être fait en utilisant une instance D'animateur, tout comme animer une vue simple