2015-10-19 2 views

ответ

-4

НЕТ необходимости в координационном макете с использованием обычного вида выровняйте снэк-бар в нижней части окна и поместите на него кнопку, нажав кнопку любой вашей логики, покажите закусочную или линейную раскладка.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
/*snackbar code 

<LinearLayout 
      android:id="@+id/linear_snack bar" 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/margin_45" 
      android:layout_alignParentBottom="true" 
      android:layout_marginTop="@dimen/margin_0" 
      android:background="@color/dark_grey"> 

      <TextView 
       android:layout_width="0dp" 
       android:layout_height="match_parent" 
       android:layout_weight="1" 
       android:background="@color/orange" 
       android:gravity="center" 
       android:textColor="@color/white" 
       android:textSize="@dimen/text_size_h7" /> 

      <TextView 
       android:layout_width="0dp" 
       android:layout_height="match_parent" 
       android:layout_weight="1" 
       android:gravity="center" 
       android:textSize="@dimen/text_size_h7" /> 
     </LinearLayout> 

<View android:layout_above="@+id/linear_snack bar" 



</RelativeLayout> 
+1

Я не могу сказать, использовали ли вы переднюю закусочную, но это не обычная реализация. Обычно это динамическое предупреждение, которое добавляется во время выполнения. Если это метод, который сработал для вас, попробуйте быть более конкретным, а не комментируя «код закуски», который, возможно, является одной из наиболее важных частей макета. –

49

Я собираюсь рассказать об утверждённом ответе, потому что я думаю, что есть немного более простая реализация, чем в этой статье.

Я не смог найти встроенное поведение, которое обрабатывает общее перемещение взглядов, но это один хороший вариант общего назначения (от http://alisonhuang-blog.logdown.com/posts/290009-design-support-library-coordinator-layout-and-behavior связан в другом комментарии):

import android.content.Context; 
import android.support.annotation.Keep; 
import android.support.design.widget.CoordinatorLayout; 
import android.support.design.widget.Snackbar; 
import android.support.v4.view.ViewCompat; 
import android.util.AttributeSet; 
import android.view.View; 

@Keep 
public class MoveUpwardBehavior extends CoordinatorLayout.Behavior<View> { 

    public MoveUpwardBehavior() { 
     super(); 
    } 

    public MoveUpwardBehavior(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { 
     return dependency instanceof Snackbar.SnackbarLayout; 
    } 

    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 
     float translationY = Math.min(0, ViewCompat.getTranslationY(dependency) - dependency.getHeight()); 
     ViewCompat.setTranslationY(child, translationY); 
     return true; 
    } 

    //you need this when you swipe the snackbar(thanx to ubuntudroid's comment) 
    @Override 
    public void onDependentViewRemoved(CoordinatorLayout parent, View child, View dependency) { 
     ViewCompat.animate(child).translationY(0).start(); 
    } 
} 

затем , в файле макета добавить layout_behavior, как показано ниже:

<LinearLayout 
    android:id="@+id/main_content" 
    android:orientation="vertical" 
    app:layout_behavior="com.example.MoveUpwardBehavior"/> 

где layout_behavior полный путь к пользовательскому поведению. Нет необходимости подклассифицировать LinearLayout, если у вас нет конкретной необходимости иметь поведение по умолчанию, что кажется необычным.

+0

Как это отличается от принятого решения? –

+7

Это решение не требует подклассификации целевого представления, которое, по моему мнению, является чрезмерным. Также, как правило, лучше всего объяснять ответ inline, поскольку ссылки, как правило, уходят через некоторое время. –

+5

Отличное решение. Чтобы поддержать салфетки для удаления закуски, добавьте следующий код: '@Override public void onDependentViewRemoved (координаторLayout parent, View child, View dependency) { super.onDependentViewRemoved (parent, child, dependency); child.setTranslationY (0); } ' – ubuntudroid

2

Я реализовал это и обнаружил, что когда закусочная исчезла, вид остался белым пространством в месте закусочных, по-видимому, это известно, если анимация отключена на устройстве.

Чтобы исправить это, я изменил метод onDependentViewChanged, чтобы сохранить начальную позицию Y вида, к которой привязано это поведение. Тогда при удалении закусочной сброса положение этой точки зрения к сохраненной позиции Y

private static float initialPositionY; 

@Override 
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 
    initialPositionY = child.getY(); 
    float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight()); 
    child.setTranslationY(translationY); 
    return true; 
} 

@Override 
public void onDependentViewRemoved(CoordinatorLayout parent, View child, View dependency) { 
    super.onDependentViewRemoved(parent, child, dependency); 
    child.setTranslationY(initialPositionY); 
} 
0

В дополнение к ответу Travis Кастильо: Для того, чтобы разрешить запуск последовательных закусочные, в onDependentViewChanged(), вы должны отменить любые возможности текущей анимации начала по onDependentViewRemoved():

@Override 
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 
    float translationY = Math.min(0, ViewCompat.getTranslationY(dependency) - dependency.getHeight()); 
    ViewCompat.animate(child).cancel(); //cancel potential animation started in onDependentViewRemoved() 
    ViewCompat.setTranslationY(child, translationY); 
    return true; 
} 

без отмены, то LinearLayout будет прыгать вниз ниже 2-го закусочной, когда закусочная заменяется другой закусочная.

5

На основании ответа @Travis Castillo. Исправлены проблемы, такие как:

Moving entire layout up and cause the objects on top of view disappear. 
Doesnt push the layout up when showing SnackBars immediately after eachother. 

Так вот фиксировано код MoveUpwardBehavior Класс:

import android.content.Context; 
import android.support.annotation.Keep; 
import android.support.design.widget.CoordinatorLayout; 
import android.support.design.widget.Snackbar; 
import android.support.v4.view.ViewCompat; 
import android.util.AttributeSet; 
import android.view.View; 

@Keep 
public class MoveUpwardBehavior extends CoordinatorLayout.Behavior<View> { 

    public MoveUpwardBehavior() { 

     super(); 

    } 

    public MoveUpwardBehavior(Context context, AttributeSet attrs) { 

     super(context, attrs); 

    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { 

     return dependency instanceof Snackbar.SnackbarLayout; 

    } 

    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 

     float translationY = Math.min(0, ViewCompat.getTranslationY(dependency) - dependency.getHeight()); 

     //Dismiss last SnackBar immediately to prevent from conflict when showing SnackBars immediately after eachother 
     ViewCompat.animate(child).cancel(); 

     //Move entire child layout up that causes objects on top disappear 
     ViewCompat.setTranslationY(child, translationY); 

     //Set top padding to child layout to reappear missing objects 
     //If you had set padding to child in xml, then you have to set them here by <child.getPaddingLeft(), ...> 
     child.setPadding(0, -Math.round(translationY), 0, 0); 

     return true; 
    } 

    @Override 
    public void onDependentViewRemoved(CoordinatorLayout parent, View child, View dependency) { 

     //Reset paddings and translationY to its default 
     child.setPadding(0, 0, 0, 0); 
     ViewCompat.animate(child).translationY(0).start(); 

    } 
} 

Это кода толкает вверх то, что пользователь видит на экране и, кроме того пользователь имеет доступ ко всем объектам в макете в то время как закусочная показывает.

Если вы хотите закусочной покрыть объекты, а не толкаясь и, кроме пользователя, имеют доступ ко всем объектам, то вам необходимо изменить метод onDependentViewChanged:

@Override 
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 

    float translationY = Math.min(0, ViewCompat.getTranslationY(dependency) - dependency.getHeight()); 

    //Dismiss last SnackBar immediately to prevent from conflict when showing SnackBars immediately after eachother 
    ViewCompat.animate(child).cancel(); 

    //Padding from bottom instead pushing top and padding from top. 
    //If you had set padding to child in xml, then you have to set them here by <child.getPaddingLeft(), ...> 
    child.setPadding(0, 0, 0, -Math.round(translationY)); 

    return true; 
} 

и метод onDependentViewRemoved:

@Override 
public void onDependentViewRemoved(CoordinatorLayout parent, View child, View dependency) { 

    //Reset paddings and translationY to its default 
    child.setPadding(0, 0, 0, 0); 

} 

К сожалению, вы потеряете анимацию при удалении пользователя, чтобы удалить SnackBar. И вы должны использовать класс ValueAnimator, чтобы сделать анимацию для изменений дополнений, что делает некоторые конфликты здесь, и вы должны их отлаживать.

https://developer.android.com/reference/android/animation/ValueAnimator.html

Любой комментарий о анимации для салфетки, чтобы удалить закусочной оценили.

Если вы можете пропустить эту анимацию, вы можете ее использовать.

Во всяком случае, я рекомендую первый тип.

0

Я написал библиотеку, в которую можно добавить дополнительные виды для анимации с помощью SnackProgressBar. Он также включает progressBar и другие вещи. Попробуйте https://github.com/tingyik90/snackprogressbar

Предположим, у вас есть следующие виды для анимации.

View[] views = {view1, view2, view3}; 

Создайте экземпляр SnackProgressBarManager в своей деятельности и включите представление для анимации.

SnackProgressBarManager snackProgressBarManager = new SnackProgressBarManager(rootView) 
     .setViewsToMove(views) 

Когда SnackProgressBar отображается или отклоняется, эти представления будут соответственно анимированы.

 Смежные вопросы

  • Нет связанных вопросов^_^