当小吃店在Android中显示浮动操作button不上去

  1. 我在我的应用程序中使用小吃店和FAB相同的页面, 每当小吃店显示浮动操作button不上去

  2. 我使用第三方库attachToListView工作正常

    import com.melnykov.fab.FloatingActionButton; 

如果我使用默认库“不能解决attachToListView”

 import android.support.design.widget.FloatingActionButton; 

我的需要:

  1. attachToListView应该工作( 当ListView向下滚动FAB将消失 )。

  2. 每当小吃店显示浮动行动button应该上去

帮助我如何解决这个问题。

第三方图书馆链接

编辑:1

我删除了第三方库添加默认导入( 导入android.support.design.widget.FloatingActionButton ),FAB正在上升,但Attachtolistivew没有解决。

编辑:2

我用ListView在我的活动,与FAB和Snackbar。 所以我需要像FAB这样的两个选项当Snackbar打开Listview向下滚动时应该隐藏FAB

我的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> 

Solutions Collecting From Web of "当小吃店在Android中显示浮动操作button不上去"

您的要求是:

1)当Listview向下滚动FAB将消失

2)每当Snackbar显示Floating Action button应该上去。

现在检查你的解决scheme

1)如果你打算使用design support library fab你将只满足约束条件2。

2)如果你打算使用第三方fab你将只满足约束条件1。

您可以通过操作第三方库和添加animation来满足您的两个约束,当您要显示snackbar或通过操作ListView将其放入CordinateLayout ,然后在ListView向下滚动时使fab消失。

我的解决scheme

最快的解决scheme是将您的ListView更改为RecyclerView并使用CordinateLayoutdesign support library fab 。 现在你可以实现#2。 ( RecyclerView是比ListView更强大的部件,为什么我必须这么做呢?因为CordinateLayout创build的animation只能通过任何实现了NestedScrolling接口的滚动窗口部件来实现,而LOLLIPOPListView实现了这个接口。低于LOLLIPOP你必须使用RecyclerView )。

对于号码#1你可以使用下面的代码:

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

你的布局是:

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

我们有2种方法来做到这一点:

每当小吃店显示浮动行动button应该上去。

您正在使用第三个库: import com.melnykov.fab.FloatingActionButton; 所以你需要实现自定义行为:

  1. 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. 自定义行为类:

     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应该工作(当ListView向下滚动FAB将消失)

或者,如果您想使用devise库中的浮动操作button,您可以像这样使用RecyclerView实现,您还需要实现自定义行为:

  1. 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. 你的行为类:

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

您的父级布局需要是CoordinatorLayout p / s:我不知道为什么我的xml代码没有显示我的文件中的所有文本,所以我无法为您显示完整的xml文件。

要使用浮动操作button,您应该使用此结构为您的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> 

content_main应该是您定义所有文本和button以及其他内容的主要内容。 协调器的布局应该包含这么多的代码。 它可能包含的额外代码是工具栏或导航抽屉。 主要内容应该总是另一个xml文件。

主要活动

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

您需要使用<android.support.design.widget.CoordinatorLayout作为布局文件中的根标记。 只有这样你才能得到你想要的结果。

步骤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> 

第2步:

 CoordinatorLayout myCoordinatorLayout = (CoordinatorLayout)findViewById(R.id.mycoordinatorLayout); Snackbar snack = Snackbar.make(myCoordinatorLayout,"Successfully.!",Snackbar.LENGTH_SHORT); 

有关更多信息,请查看Android开发人员博客 。