web-dev-qa-db-fra.com

Bouton d'action flottant ne monte pas quand Snack bar est affiché dans Android

  1. J'utilise Snack bar et FAB dans mon application Même page, Chaque fois que Snackbar affiche le bouton d'action flottante qui ne monte pas.

  2. J'utilise une bibliothèque tierce pour attachToListView fonctionne bien

    import com.melnykov.fab.FloatingActionButton;
    

si j'utilise la bibliothèque par défaut "ne peut pas être résolu attachToListView"

import Android.support.design.widget.FloatingActionButton;

Mon besoin:

  1. attachToListView devrait fonctionner (For lorsque Listview Scroling Down FAB disparaîtra).

  2. Chaque fois que Snackbar affiche le bouton d'action flottante doit monter.

Aidez-moi à résoudre ce problème.

Lien vers une bibliothèque tierce

EDIT: 1

J'ai supprimé la bibliothèque tierce ajoutée lors de l'importation par défaut (import Android.support.design.widget.FloatingActionButton), FAB est en train de monter mais Attachtolistivew n'est pas résolu.

EDIT: 2

J'ai utilisé Listview Dans mon activité, avec FAB et Snackbar . Il me faut donc les deux options, comme FAB monter lorsque Snackbar s'ouvre et que Listview fait défiler vers le bas Devrait masquer FAB

Mon code Snackbar:

 Snackbar snack = Snackbar.make(fab1, " Successfully ...!",Snackbar.LENGTH_SHORT);
                    View snackbarView = snack.getView();
                    snackbarView.setBackgroundColor(Color.parseColor("#f44336"));
                    snack.show();

Main.Java

import com.melnykov.fab.FloatingActionButton;
     @Override
        protected void onCreate(Bundle savedInstanceState) 
    {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.fabview);

            fab1 = (FloatingActionButton) findViewById(R.id.fab);

            fab1.setShadow(true);
            //fab.attachToListView(provider_service_list);

            //FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
            fab1.attachToListView(listViewData, new ScrollDirectionListener()
            {
                @Override
                public void onScrollDown() {
                    Log.d("ListViewFragment", "onScrollDown()");
                }

                @Override
                public void onScrollUp() {
                    Log.d("ListViewFragment", "onScrollUp()");
                }
            }, new AbsListView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(AbsListView view, int scrollState) {
                    Log.d("ListViewFragment", "onScrollStateChanged()");
                }

                @Override
                public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                    Log.d("ListViewFragment", "onScroll()");
                }
            });

    }

fabview.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:app78="http://schemas.Android.com/apk/res-auto"
        xmlns:tools="http://schemas.Android.com/tools"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        >
    >
    <Android.support.design.widget.CoordinatorLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:id="@+id/coordinatorlayout">

            <com.melnykov.fab.FloatingActionButton
                Android:id="@+id/fab"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_gravity="bottom|right"
                Android:layout_margin="@dimen/fab_margin"
                Android:src="@drawable/ic_add_white_24dp"
                app78:fab_colorNormal="@color/accent"
                app78:fab_colorPressed="@color/accent_pressed"
                app78:fab_colorRipple="@color/ripple"
                app78:fabSize="normal"
                app78:borderWidth="0dp"
                Android:layout_marginBottom="@dimen/fab_margin_bottom"
                Android:layout_marginRight="@dimen/fab_margin_right"
                />

        </Android.support.design.widget.CoordinatorLayout>
   </RelativeLayout>
15
Kumar

Nous avons 2 façons de faire cela:

Lorsque la barre d’affichage montre un bouton d’action flottante, elle doit monter.

Vous utilisez la 3ème lib: import com.melnykov.fab.FloatingActionButton;so vous devez implémenter un comportement personnalisé:

  1. fichier xml:

    <com.melnykov.fab.FloatingActionButton xmlns:fab="http://schemas.Android.com/apk/res-auto"
        Android:id="@+id/fab"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="bottom|end"
        Android:layout_margin="16dp"
        Android:src="@drawable/sort_variant"
        fab:fab_colorNormal="@color/colorPrimary"
        fab:fab_colorPressed="@color/colorPrimaryDark"
        fab:fab_colorRipple="@color/colorAccent"
        app:layout_behavior="com.simpleapp.tvtan.testcustomfloatingactionbutton.SnackBarBehavior"/>
    

  2. Classe de comportement personnalisé:

    public class SnackBarBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> {
    public SnackBarBehavior() {
    }
    
    public SnackBarBehavior(Context context, AttributeSet attrs) {
    super(context, attrs);
    }
    
    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) {
    return dependency instanceof Snackbar.SnackbarLayout;
    }
    
    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton child, View dependency) {
    float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
    child.setTranslationY(translationY);
    return true;
      }
    }
    

attachToListView devrait fonctionner (pour quand Listview Scroling Down FAB disparaîtra )

Ou, si vous souhaitez utiliser un bouton d'action flottant à partir de Design Library, vous pouvez implémenter avec RecyclerView de la manière suivante: vous devez également implémenter un comportement personnalisé:

  1. fichier xml: 

<Android.support.v7.widget.RecyclerView
    Android:id="@+id/recycler_view"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"/>

<Android.support.design.widget.FloatingActionButton
    Android:id="@+id/fab"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:src="@drawable/sort_variant"
    Android:layout_gravity="bottom|end"
    Android:layout_margin="16dp"
    app:layout_behavior="com.simpleapp.tvtan.testcustomfloatingactionbutton.ScrollBehavior"/>

  1. Votre classe de comportement:

    public class ScrollBehavior extends FloatingActionButton.Behavior {
    
    public ScrollBehavior(Context context, AttributeSet attrs) {
    super();
    }
    
    @Override
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
    super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
    if (dyConsumed > 0) {
        CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) child.getLayoutParams();
        int fab_bottomMargin = layoutParams.bottomMargin;
        child.animate().translationY(child.getHeight() + fab_bottomMargin).setInterpolator(new LinearInterpolator()).start();
    } else if (dyConsumed < 0) {
        child.animate().translationY(0).setInterpolator(new LinearInterpolator()).start();
        }
      }
    
    @Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) {
    return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL;
      }
    }
    

Votre mise en page parent doit être un CoordinatorLayout P/s: je ne sais pas pourquoi mon code xml n'affiche pas tout le texte de mon fichier, je ne peux donc pas afficher le fichier xml complet pour vous.

6
Tan Tran

pour utiliser le bouton d'action flottant, vous devez utiliser cette structure pour votre xml-

<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.CoordinatorLayout 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"
Android:fitsSystemWindows="true"
tools:context="com.afixi.prasenjeetpati.trailone.MainActivity">

<include layout="@layout/content_main" />

<Android.support.design.widget.FloatingActionButton
    Android:id="@+id/fab"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_gravity="bottom|end"
    Android:layout_margin="@dimen/fab_margin"
    Android:src="@Android:drawable/ic_dialog_email" />

</Android.support.design.widget.CoordinatorLayout>

le content_main devrait être votre contenu principal où vous définissez tous vos textes et boutons et tout autre contenu. la mise en page du coordinateur doit contenir autant de code. le code supplémentaire qu'il peut contenir est barre d'outils ou tiroir de navigation. le contenu principal doit toujours être un autre fichier XML.

Activité principale

 FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
0
Sagar Nayak

Vous devez utiliser <Android.support.design.widget.CoordinatorLayout comme balise racine dans votre fichier de présentation. Ce n’est qu’alors que vous pourrez obtenir le résultat souhaité. 

ÉTAPE 1

 <?xml version="1.0" encoding="utf-8"?>
 <Android.support.design.widget.CoordinatorLayout
 xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app78="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/myCoordinatorLayout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">              

        <com.melnykov.fab.FloatingActionButton
            Android:id="@+id/fab"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_gravity="bottom|right"
            Android:layout_margin="@dimen/fab_margin"
            Android:src="@drawable/ic_add_white_24dp"
            app78:fab_colorNormal="@color/accent"
            app78:fab_colorPressed="@color/accent_pressed"
            app78:fab_colorRipple="@color/ripple"
            app78:fabSize="normal"
            app78:borderWidth="0dp"
            Android:layout_marginBottom="@dimen/fab_margin_bottom"
            Android:layout_marginRight="@dimen/fab_margin_right"
            />

  </Android.support.design.widget.CoordinatorLayout>    

ÉTAPE 2:

CoordinatorLayout myCoordinatorLayout = (CoordinatorLayout)findViewById(R.id.mycoordinatorLayout);

Snackbar snack = Snackbar.make(myCoordinatorLayout,"Successfully.!",Snackbar.LENGTH_SHORT);

Pour plus d'informations, consultez Dev blog Android .

0
Sjd