アプリケーションでスナックバーとFABを使用しています。同じページスナックバーにフローティングアクションボタンが表示されないときはいつでも。
attachToListViewのサードパーティライブラリを使用しています
import com.melnykov.fab.FloatingActionButton;
デフォルトライブラリを使用している場合 "解決できませんattachToListView"
import Android.support.design.widget.FloatingActionButton;
私の必要性:
attachToListViewは機能するはずです(For Listview Scroling Down FAB is Disappear)。
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>
要件は次のとおりです。
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つの制約を満たすことができます。
私の解決策:
最速の解決策は、ListView
をRecyclerView
に変更し、CordinateLayout
とdesign support library fab
を使用することです。 #2を達成できるようになりました。 (RecyclerView
はListView
よりも強力なウィジェットです。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>
これには2つの方法があります。
スナックバーにフローティングアクションボタンが表示されているときはいつでも上に移動する必要があります。
3番目のlibを使用しています:import com.melnykov.fab.FloatingActionButton;
したがって、カスタム動作を実装する必要があります。
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"/>
カスタム動作クラス:
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を使用して実装できます。カスタム動作も実装する必要があります。
<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"/>
あなたの行動クラス:
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ファイルを表示できません。
フローティングアクションボタンを使用するには、この構造を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();
}
});
レイアウトファイルのルートタグとして<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開発ブログ をご覧ください。