当小吃栏在Android

时间:2016-03-14 13:04:29

标签: android floating-action-button android-snackbar

  1. 我在我的应用程序中使用Snack bar和FAB Same Page,每当Snackbar显示Floating Action按钮不上升

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

    import com.melnykov.fab.FloatingActionButton;
    
  3. 如果我使用默认库“无法解析attachToListView”

    import android.support.design.widget.FloatingActionButton;
    

    我的需要:

    1. attachToListView应该有效(当Listview向下滚动FAB时将消失)。

    2. 每当 Snackbar显示浮动操作按钮应该上升

    3. 帮我解决这个问题。

      Third Party Library Link

      编辑: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>
      

4 个答案:

答案 0 :(得分:8)

您的要求是:

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

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

现在检查一下你的解决方案:

1)如果您打算使用design support library fab,您将只满足约束数2。

2)如果您打算使用第三方fab,您只能满足约束号1。

您可以通过操纵第三方库并在要显示snackbar时添加动画或通过操纵ListView将其放入CordinateLayout然后生成{来满足您的2个约束当fab向下滚动时,{1}}消失。

我的解决方案:

最快的解决方案是将您的ListView更改为ListView并使用RecyclerViewCordinateLayout。现在你可以达到#2。 (design support library fab是比RecyclerView更强大的小部件。为什么我必须这样做?因为ListView创建动画并且它只适用于实现CordinateLayout接口的任何滚动小部件。NestedScrolling中的ListView实现了该接口。如果你的min SDK低于LOLLIPOP,你必须使用LOLLIPOP。)

对于数字#1,您可以使用以下代码:

RecyclerView

你的布局是:

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

答案 1 :(得分:8)

我们有两种方法可以做到这一点:

  

每当Snackbar显示浮动操作按钮时应该上升。

您正在使用第三个库: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;
      }
    }
    
  3.   

    attachToListView应该工作(当Listview向下滚动FAB时   消失)

    或者,如果您想使用Design Library中的Floating Action Button,您可以像这样使用RecyclerView实现,您也需要实现自定义行为:

    1. xml文件:
    2. <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;
          }
        }
        
      2. 您的父布局需要是CoordinatorLayout p / s:我不知道为什么我的xml代码没有显示我文件中的所有文本,所以我无法为你显示完整的xml文件。

答案 2 :(得分:0)

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

STEP: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 dev blog

答案 3 :(得分:0)

要使用浮动操作按钮,您应该将此结构用于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应该是您定义所有文本和按钮以及其他内容的主要内容。协调器布局应该包含这么多代码。它可能包含的额外代码是工具栏或导航抽屉。主要内容应该始终是另一个xml文件。

<强> Mainactivity

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