it-swarm.com.ru

Настройка приложения: layout_behavior программно

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

Обычно для повторного просмотра, чтобы установить это поведение, я бы добавил его в xml:

app:layout_behavior="@string/appbar_scrolling_view_behavior"

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

<?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:id="@+id/coordLayout"
    Android:layout_height="match_parent" Android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <Android.support.design.widget.AppBarLayout Android:id="@+id/app_bar"
        Android:fitsSystemWindows="true" Android:layout_height="@dimen/app_bar_height"
        Android:layout_width="match_parent" Android:theme="@style/AppTheme.AppBarOverlay">

        <Android.support.design.widget.CollapsingToolbarLayout Android:id="@+id/toolbar_layout"
            Android:fitsSystemWindows="true" Android:layout_width="match_parent"
            Android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:contentScrim="?attr/colorPrimary">

            <Android.support.v7.widget.Toolbar
                Android:id="@+id/toolbar"
                Android:layout_height="?attr/actionBarSize"
                Android:layout_width="match_parent"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

        </Android.support.design.widget.CollapsingToolbarLayout>

    </Android.support.design.widget.AppBarLayout>
    <FrameLayout
        Android:id="@+id/frameLayout"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

    </FrameLayout>

</Android.support.design.widget.CoordinatorLayout>
29
AndroidP

Behavior является параметром CoordinatorLayout.LayoutParams. Вы можете установить поведение для экземпляра CoordinatorLayout.LayoutParams с помощью метода setBehavior .

Чтобы получить правильный объект Behavior, который представляет собой то же самое, что и @string/appbar_scrolling_view_behavior, вы должны создать экземпляр AppBarLayout.ScrollingViewBehavior .


Правка 1:

У меня действительно нет примера, но я могу написать вам один. Предполагая, что у вас есть View (например, yourView), который уже присоединен к CoordinatorLayout (поэтому он уже имеет LayoutParams).

CoordinatorLayout.LayoutParams params = 
                            (CoordinatorLayout.LayoutParams) yourView.getLayoutParams();
params.setBehavior(new AppBarLayout.ScrollingViewBehavior());
yourView.requestLayout();

Возможно, вам придется немного подправить (я не проверял это, но это должно работать).


Правка 2:

Просто небольшой отказ от ответственности, потому что не все, кажется, прекрасно понимают пример.

yourView, упомянутый в приведенном выше примере, является , А НЕ самой CoordinatorLayout. yourView - CoordinatorLayout's child View.

76
Bartek Lipinski

Принятый ответ правильный, но указанный код не компилируется. Итак, вот полный пример 

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) 
view.getLayoutParams();

params.setBehavior(new AppBarLayout.ScrollingViewBehavior(view.getContext(), null));

2-й параметр - AttributeSet, и его можно использовать как null, хотя он не помечен как Nullable в lib поддержки.

1
tasomaniac

Чтобы включить и отключить layout_behavior программно с помощью kotlin используйте этот код:

fun enableLayoutBehaviour() {
    val param: CoordinatorLayout.LayoutParams = swipeRefreshView.layoutParams as CoordinatorLayout.LayoutParams
    param.behavior = AppBarLayout.ScrollingViewBehavior()
}

fun disableLayoutBehaviour() {
    val param: CoordinatorLayout.LayoutParams = swipeRefreshView.layoutParams as CoordinatorLayout.LayoutParams
    param.behavior = null
}

Примечание: замените swipeRefreshView своим видом 

0
Kapil Rajput