Плавающая кнопка действия не поднимается, когда в Snack bar отображается в android
-
Я использую Снек-бар и FAB в своем приложении. Одна и та же страница, Всякий раз, когда Snackbar показывает кнопку плавающего действия не вверх.
-
Я использую библиотеку сторонних разработчиков для attachToListView работает отлично
import com.melnykov.fab.FloatingActionButton;
если я использую библиотеку по умолчанию , не может быть разрешено attachToListView
import android.support.design.widget.FloatingActionButton;
Моя потребность:
-
attachToListView должен работать (В случае, когда Listview Scroll Down Down FAB исчезнет).
-
Всякий раз, когда Snackbar показывает плавающее действие, кнопка должна идти вверх.
Помогите мне, как решить эту проблему.
Ссылка сторонней библиотеки
EDIT: 1
Я удалил стороннюю библиотеку добавлен импорт по умолчанию (import android.support.design.widget.FloatingActionButton), FAB идет вверх, но Attachtolistivew не решается.
EDIT: 2
Я использовал Listview В своей деятельности с FAB и Snackbar.
Так что мне нужны оба варианта, как FAB Go up When Snackbar Opens, и когда Прокрутка списка просматривается, следует скрыть 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
Ваши требования:
1) Когда Listview
"Спуска вниз" FAB
исчезнет
2) Всякий раз, когда Snackbar
показывает Floating Action button
Должен идти вверх.
Теперь рассмотрите ваши решения:
1) Если вы собираетесь использовать design support library fab
, вы удовлетворите только номер ограничения 2.
2) Если вы собираетесь использовать сторонний FAB
, вы удовлетворите только номеру ограничения.
Вы можете удовлетворить ваши 2 ограничения, либо манипулируя библиотекой сторонних разработчиков, либо добавляя анимацию, когда вы собираетесь показывать Snackbar
, или манипулируя Listview
, чтобы поместить его внутри CordinateLayout
, а затем отпустите FAB
, когда Listview
Прокрутка вниз.
Мое решение:
Самое быстрое решение меняет ваш Listview
на RecyclerView
и использует CordinateLayout
и design support library fab
. теперь вы можете достичь # 2.
(RecyclerView
- более мощный виджет, чем Listview
). Почему я должен это делать? потому что CordinateLayout
создает вашу анимацию и работает только с помощью любого прокручиваемого виджета, реализующего интерфейс NestedScrolling
. Listview
from LOLLIPOP
и вверх реализует этот интерфейс. Если ваш минимальный SDK ниже 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
У нас есть 2 способа сделать это:
Всякий раз, когда кнопка Snackbar показывает плавающее действие, следует перейти вверх.
Вы используете 3rd 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 будет исчезнуть)
Или если вы хотите использовать Floating Action Button из библиотеки дизайна, вы можете реализовать с помощью 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;
}
}
Ваш родительский макет должен быть координаторомLayout
p/s: Я не знаю, почему мой xml-код не отобразил весь текст из моего файла, поэтому я не могу показать полный xml файл для вас.
Ответ 3
Вам нужно использовать <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 dev blog.
Ответ 4
чтобы использовать кнопку плавающего действия, вы должны использовать эту структуру для своего 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();
}
});