J'ai défini une mise en page de base pour les coordinateurs:
<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.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/tabs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:tabIndicatorColor="@color/white"
app:tabMode="fixed"/>
</Android.support.design.widget.AppBarLayout>
<Android.support.v4.view.ViewPager
Android:id="@+id/viewpager"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</Android.support.design.widget.CoordinatorLayout>
Il y a plusieurs onglets dans mon affichage. Je poste un de mes fragments simples:
<ListView
Android:id="@+id/transferList"
Android:layout_width="match_parent"
Android:layout_height="match_parent"></ListView>
<Android.support.design.widget.FloatingActionButton
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:layout_marginBottom="@dimen/activity_vertical_margin"
Android:layout_marginRight="@dimen/activity_horizontal_margin"
Android:layout_alignParentRight="true"
Android:src="@drawable/ic_add_white" />
Qu'est-ce qui se passe, c'est que le FAB passe hors de l'écran. Ce n'est tout simplement pas le FAB, mais d'autres fragments avec des vues de carte/listviews sont coupés en bas de l'écran. Je cherchai une solution et trouvai une solution simple: Suppression de l'application de propriété: layout_scrollFlags = "scroll | enterAlways" de la barre d'outils .
Je ne comprends pas ce qui pourrait causer cela et comment la suppression de ce qui précède a résolu le problème. Est-ce un bug dans la bibliothèque de support? Y a-t-il une meilleure façon de résoudre ce problème? Une autre solution que j’ai trouvée est de ici - de garder le bouton FAB directement sous une présentation de coordonnateur dans l’activité, et de le rendre visible uniquement dans le fragment dont vous avez besoin. Cela ne semblait pas être une bonne solution pour moi. En outre, d'autres vues dans mes fragments ont également été coupées.
En effet, vous utilisez CoordinatorLayout
avec ListView
. Vous pouvez modifier votre implémentation en RecyclerView
pour obtenir un défilement correct.
vérifier ma réponse ici . Cela peut vous aider.
J'ai résolu ce problème en modifiant l'attribut app:layout_scrollFlags="scroll|enterAlways"
de Toolbar / en app:layout_scrollFlags="enterAlways"
.
J'ai une mise en page similaire à la vôtre: activité avec une barre d'outils partant du haut et des onglets. Et l'exigence de fragments est d'avoir leurs propres FAB indépendants.
Je ne pouvais pas y faire face directement dans le XML, alors je l'ai cloué de cette façon:
Présentation de l'activité
<Android.support.design.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/main_content"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true">
<Android.support.design.widget.AppBarLayout
Android:id="@+id/appbar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:fitsSystemWindows="true"
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:layout_marginBottom="20dp"
Android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways|snap"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<Android.support.design.widget.TabLayout
Android:id="@+id/tabs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:tabContentStart="72dp"
app:tabMode="scrollable" />
</Android.support.design.widget.AppBarLayout>
<Android.support.v4.view.ViewPager
Android:id="@+id/viewpager"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
Disposition des fragments:
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<include
Android:id="@+id/scroll"
layout="@layout/content_activity_main"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
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:layout_gravity="bottom|right|end"
Android:src="@Android:drawable/ic_input_add"
app:borderWidth="0dp"
app:fabSize="mini"
app:useCompatPadding="true" />
Et un peu de code pour que le FAB reste là où il était prévu. Fragment onCreateView:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.fragment_tabs2, container, false);
final FloatingActionButton fab = (FloatingActionButton) rootView.findViewById(R.id.fab);
final TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.tabs);
final AppBarLayout appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.appbar);
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
int maxAbsOffset = appBarLayout.getMeasuredHeight() - tabLayout.getMeasuredHeight();
fab.setTranslationY(-maxAbsOffset - verticalOffset);
}
});
return rootView;
}
Il y a 2 solutions à ce problème:
scroll
de la barre d'outils de app:layout_scrollFlags
(par exemple app:layout_scrollFlags="enterAlways"
) ou supprimer le app:layout_scrollFlags
entier.scroll
, le contenu/fragment de la présentation principale doit utiliser RecyclerView
ou NestedScrollView
.https://code.luasoftware.com/tutorials/Android/bottom-of-fragment-in-viewpager-out-of-screen/
Supprimer le défilement de l'attribut layout_scrollFlags de la barre d'outils. Vous devriez avoir quelque chose comme ceci: app:layout_scrollFlags="enterAlways|enterAlwaysCollapsed"