web-dev-qa-db-ja.com

スナックバーがandroid

  1. アプリケーションでスナックバーとFABを使用しています。同じページスナックバーにフローティングアクションボタンが表示されないときはいつでも

  2. attachToListViewのサードパーティライブラリを使用しています

    import com.melnykov.fab.FloatingActionButton;
    

デフォルトライブラリを使用している場合 "解決できませんattachToListView"

import Android.support.design.widget.FloatingActionButton;

私の必要性:

  1. attachToListViewは機能するはずです(For Listview Scroling Down FAB is Disappear)。

  2. Snackbarがフローティングアクションボタンを表示しているときはいつでも.

この問題の解決方法を教えてください。

サードパーティライブラリリンク

編集:1

デフォルトのインポートを追加したサードパーティライブラリを削除しました(import Android.support.design.widget.FloatingActionButton)、FABは起動していますが、Attachtolistivewは解決されていません。

EDIT:2

私はFABとスナックバーで、リストビューを使用しました。だから私はスナックバーが開いたときのように両方のオプションが必要ですスナックバーが開いたときリストビューが下にスクロールしているとき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>
18
Kumar

要件は次のとおりです。

1)Listview Scroling Down FABが消えるとき

2)Snackbarが表示されているときはいつでもFloating Action buttonが表示されます。

次に、ソリューションを調べます。

1)design support library fabを使用する場合は、制約番号2のみを満たします。

2)サードパーティのfabを使用する場合は、制約番号1のみを満たします。

snackbarを表示するときにサードパーティライブラリを操作してアニメーションを追加するか、ListViewを操作してCordinateLayout内に配置し、fabが下にスクロールしているときにListViewを非表示にして、2つの制約を満たすことができます。

私の解決策:

最速の解決策は、ListViewRecyclerViewに変更し、CordinateLayoutdesign support library fabを使用することです。 #2を達成できるようになりました。 (RecyclerViewListViewよりも強力なウィジェットです。CordinateLayoutがアニメーションを作成し、NestedScrollingインターフェースを実装するスクロールウィジェットによってのみ機能するためです。ListViewからのLollipopがそのインターフェースを実装しています。 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>
9
user5703518

これには2つの方法があります。

スナックバーにフローティングアクションボタンが表示されているときはいつでも上に移動する必要があります。

3番目のlibを使用しています: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は機能するはずです(リストビュースケールダウンFABが消える場合)

または、デザインライブラリのフローティングアクションボタンを使用する場合は、次のように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ファイルを表示できません。

8
Norutan

フローティングアクションボタンを使用するには、この構造を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ファイルである必要があります。

メインアクティビティ

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

レイアウトファイルのルートタグとして<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開発ブログ をご覧ください。

0
Sjd