web-dev-qa-db-fra.com

Partie de fragment à l'intérieur de ViewPager se coupant en bas de l'écran (Android)

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.

22
shiladitya

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.

1
sha

J'ai résolu ce problème en modifiant l'attribut app:layout_scrollFlags="scroll|enterAlways" de Toolbar / en app:layout_scrollFlags="enterAlways".

24
ban-geoengineering

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;
    }
4
RoK

Il y a 2 solutions à ce problème:

  • Vous pouvez supprimer la scroll de la barre d'outils de app:layout_scrollFlags (par exemple app:layout_scrollFlags="enterAlways") ou supprimer le app:layout_scrollFlags entier.
  • Si vous avez besoin de l'attribut 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/

0
Desmond Lua

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"

0
hassan_codes