web-dev-qa-db-de.com

Schwimmende Aktionsschaltfläche Wird nicht angezeigt, wenn die Snackleiste in Android angezeigt wird

  1. Ich verwende Snackbar und FAB in meiner Anwendung. Gleiche Seite, Wenn Snackbar angezeigt wird, schwebende Aktionsschaltfläche wird nicht angezeigt.

  2. Ich verwende die Bibliothek von Drittanbietern für attachToListView

    import com.melnykov.fab.FloatingActionButton;
    

wenn ich die Standardbibliothek benutze, kann "nicht aufgelöst werden attachToListView"

import Android.support.design.widget.FloatingActionButton;

Mein Bedürfnis:

  1. attachToListView sollte funktionieren (For Wenn Listview Scroling FAB verschwindet).

  2. Immer, wenn Snackbar angezeigt wird, schwebende Aktionstaste..

Helfen Sie mir, wie Sie dieses Problem lösen können.

Link zu Drittanbieter-Bibliotheken

EDIT: 1

Ich habe die Bibliothek von Drittanbietern hinzugefügt (Standardimport hinzugefügt) (import Android.support.design.widget.FloatingActionButton). FAB geht nach oben, Attachtolistivew ist jedoch nicht gelöst.

EDIT: 2

Ich habe Listview verwendet In meiner Aktivität mit FAB und Snackbar. Ich brauche also beide Optionen wie FAB. Nach oben, wenn sich Snackbar öffnet und wenn Listview nach unten scrollen sollte. FAB ausblenden. 

Mein SnackBar-Code:

 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

Ihre Anforderungen sind:

1) Wenn Listview gescrollt wird, verschwindet FAB

2) Wenn Snackbar angezeigt wird, sollte Floating Action button Steigen.

Untersuchen Sie nun Ihre Lösungen:

1) Wenn Sie design support library fab Verwenden, erfüllen Sie nur die Bedingung Nummer 2.

2) Wenn Sie Drittanbieter fab verwenden, erfüllen Sie nur die Bedingung Nummer 1.

Sie können Ihre beiden Einschränkungen erfüllen, indem Sie entweder die Bibliothek eines Drittanbieters manipulieren und eine Animation hinzufügen, wenn Sie snackbar anzeigen möchten, oder indem Sie ListView manipulieren, um sie in CordinateLayout einzufügen, und dann fab verschwindet, wenn ListView nach unten scrollt.

Meine Lösung:

Die schnellste Lösung besteht darin, Ihre ListView in RecyclerView zu ändern und CordinateLayout und design support library fab Zu verwenden. Jetzt können Sie # 2 erreichen. (RecyclerView ist ein leistungsfähigeres Widget als ListView. Warum muss ich das tun? CordinateLayout erstellt Ihre Animation und funktioniert nur mit jedem Scroll-Widget, das NestedScrolling -Schnittstelle. Das ListView von Lollipop und höher implementiert diese Schnittstelle. Wenn Ihr min SDK niedriger als Lollipop ist, müssen Sie RecyclerView verwenden.

für Nummer 1 können Sie den folgenden Code verwenden:

 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                if (dy > 0 && fab.isShown())
                    fab.hide();
            }

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {

                if (newState ==  RecyclerView.SCROLL_STATE_IDLE) {
                    fab.show();
                }
                super.onScrollStateChanged(recyclerView, newState);
            }
        }); 

ihr Layout wäre:

<?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"
    tools:context=".MainActivity">

    <Android.support.design.widget.AppBarLayout
        Android:layout_height="wrap_content"
        Android:layout_width="match_parent"
        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:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:layout_scrollFlags="scroll|enterAlways|snap"/>

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

    <Android.support.v7.widget.RecyclerView
        Android:id="@+id/recyclerview"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        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|end"
        Android:layout_margin="@dimen/fab_margin"
        Android:src="@Android:drawable/ic_dialog_email" />

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

Wir haben zwei Möglichkeiten, dies zu tun:

Wann immer die Snackbar angezeigt wird, sollte die Schaltfläche „Floating Action“ (Schwimmende Aktion) angezeigt werden.

Sie verwenden 3rd lib: import com.melnykov.fab.FloatingActionButton; , Sodass Sie ein benutzerdefiniertes Verhalten implementieren müssen:

  1. xML-Datei:

    <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. Benutzerdefinierte Verhaltensklasse:

    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 sollte funktionieren (für, wenn Listview Scroling FAB verschwindet)

Wenn Sie den Floating Action Button aus der Design Library verwenden möchten, können Sie RecyclerView folgendermaßen implementieren. Sie müssen auch benutzerdefiniertes Verhalten implementieren:

  1. xML-Datei: 

<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. Ihre Verhaltensklasse:

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

Ihr übergeordnetes Layout muss ein CoordinatorLayout sein P/s: Ich weiß nicht, warum in meinem XML-Code nicht der gesamte Text aus meiner Datei angezeigt wurde. Daher kann ich keine vollständige XML-Datei für Sie anzeigen.

6
Tan Tran

um die Floating-Aktionstaste zu verwenden, sollten Sie diese Struktur für Ihre 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>

der content_main sollte Ihr Hauptinhalt sein, in dem Sie alle Ihre Texte, Schaltflächen und anderen Inhalte definieren. Das Layout des Koordinators sollte so viel Code enthalten. Der zusätzliche Code, den es enthalten kann, ist Symbolleiste oder Navigationsleiste. Der Hauptinhalt sollte immer eine andere XML-Datei sein.

Hauptaktivität

 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

Sie müssen <Android.support.design.widget.CoordinatorLayout als Root-Tag in Ihrer Layoutdatei verwenden. Nur dann können Sie Ihr gewünschtes Ergebnis erzielen. 

SCHRITT 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>    

SCHRITT 2:

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

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

Weitere Informationen finden Sie unter Android dev blog .

0
Sjd