Ich verwende Snackbar und FAB in meiner Anwendung. Gleiche Seite, Wenn Snackbar angezeigt wird, schwebende Aktionsschaltfläche wird nicht angezeigt.
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:
attachToListView sollte funktionieren (For Wenn Listview Scroling FAB verschwindet).
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>
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>
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:
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"/>
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:
<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"/>
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.
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();
}
});
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 .