프로그래밍 방식으로 축소 또는 축소 축소 도구 모음 레이아웃


158

간단한 질문이지만 답을 찾을 수 없습니다. CollapsingToolbarLayout프로그래밍 방식으로 축소하거나 확장하려면 어떻게해야합니까?

축소 된 툴바

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

확장 된 툴바


1
나는 같은 것을 궁금해했다. 사용자가 포함 된 레이아웃 (예 : 이미지)을 클릭하면 툴바를 전체 화면으로 확장하는 것도 흥미로울 수 있습니다.
Moritz

답변:


321

Support Library v23을 사용하여 전화를 걸 수 있습니다 appBarLayout.setExpanded(true/false).

추가 읽기 : AppBarLayout.setExpanded (boolean)


2
좋아, 팁 주셔서 감사하지만 지원 libs v23은 매우 버그가 있으므로 22.2.1을 유지해야하기 때문에 지금 테스트 할 수 없습니다.
Tomas

지금 당신은 약간의 수정과 23.0.1이
마리오 벨라스코

6
지원 라이브러리 23.1.1을 사용하여 사용자 정의 애니메이션을 정의 할 수 있습니까? setExpanded (boolean, true) 굉장히 느리게 움직이는 애니메이션 ...
Nifhel

접을 수있는 도구 모음과 그 아래에 recyclerview가있는 레이아웃이있는 문제가 있습니다. recyclerview에서 항목을 삭제할 때 툴바가 제대로 작동하지 않으므로 앱 바 레이아웃을 확장하면 제대로 작동합니다. 애니메이션에 appBarLayout.setExpanded (true, true)를 사용했습니다.
Ray Hunter

48

툴바 축소에이 코드를 사용합니다. 여전히 확장 방법을 찾을 수 없습니다.

public void collapseToolbar(){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
    behavior = (AppBarLayout.Behavior) params.getBehavior();
    if(behavior!=null) {
        behavior.onNestedFling(rootLayout, appbarLayout, null, 0, 10000, true);
    }
}

편집 1 : 음의 속도 Y와 동일한 기능 이지만 툴바가 100 % 확장되지 않고 마지막 매개 변수에 대해 false가 작동합니다

public void expandToolbar(){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
    behavior = (AppBarLayout.Behavior) params.getBehavior();
    if(behavior!=null) {
        behavior.onNestedFling(rootLayout, appbarLayout, null, 0, -10000, false);
    }
}

편집 2 :이 코드는 나를 위해 속임수를 쓴다

public void expandToolbar(){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
    behavior = (AppBarLayout.Behavior) params.getBehavior();
    if(behavior!=null) {
        behavior.setTopAndBottomOffset(0);
        behavior.onNestedPreScroll(rootLayout, appbarLayout, null, 0, 1, new int[2]);
    }
}
  • setTopAndBottomOffset은 툴바를 확장합니다
  • onNestedPreScroll은 확장 도구 모음 안에 내용을 표시합니다

혼자서 행동을 구현하려고합니다.


2
의 마지막 매개 변수를 onNestedFling로 설정하면 편집 1도 작동합니다 false.
Ricky Lee

2
params.getBehavior ()가 null을 반환합니다. xml에서 layout_behaviour 태그는 AppBarLayout이 아니라 형제 NestedScrollView에 설정됩니다. 도와주세요?
User31689

감사합니다. 마지막 param이 false 인 경우 편집 1이 올바르게 작동합니다. :)
Sirelon

@ GobletSky 나는 같은 문제에 직면했다. 내 조각에 NestedScrollView가 있었고 조각 onNestedFling 설정 하기 전에 호출하려고했습니다 . 조각을 설정 한 후 메서드를 성공적으로 호출 할 수 있습니다.
usp

@usp 사실, 내 문제는 완전히 달랐습니다 (어딘지 모르는 실수). 이것을보십시오 : stackoverflow.com/questions/31067082/…
User31689

27

사용자 정의 애니메이터를 사용하여 확장 또는 축소 정도를 정의 할 수 있습니다. 를 사용하십시오 setTopAndBottomOffset(int).

예를 들면 다음과 같습니다.

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBar.getLayoutParams();
final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
if (behavior != null) {
    ValueAnimator valueAnimator = ValueAnimator.ofInt();
    valueAnimator.setInterpolator(new DecelerateInterpolator());
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue());
            appBar.requestLayout();
        }
    });
    valueAnimator.setIntValues(0, -900);
    valueAnimator.setDuration(400);
    valueAnimator.start();
}

2
이것은 실제로 사용자 정의 오프셋에 애니메이션을 적용 할 수있는 유일한 대답입니다. 많은 감사합니다!
길 레르 메 토레스 카스트로

2
appBar.setExpanded (false, true); (열기, 닫기, 애니메이션) 모든 줄을 쓸 필요는 없습니다
Puni

2
여러 단계 축소와 같이 "사용자 지정"오프셋으로 확장 / 축소하려는 경우 @Puni로 이동해야합니다.
曾 其 威

사용자 지정 동작을 작성하지 않으려는 경우 AppBar 오프셋에 애니메이션을 적용하는 가장 좋은 방법입니다. 코드 스 니펫에 대한 한 가지 업데이트는 현재 앱바 오프셋에서 애니메이션을 시작하기 위해 behaviorAtopator.setIntValues ​​()를 0 대신 behavior.topAndBottomOffset 시작 값으로 호출하는 것입니다.
reel

사용자 정의 변수를 사용 ( -900 )하여 설정 하려면보다 valueAnimator.setIntValues- ( appBar.getTotalScrollRange() )
나은

12

에 대한 작은 확장명을 작성했습니다 AppBarLayout. CollapsibleToolbarLayout애니메이션 유무에 관계없이 확장 및 축소가 가능합니다 . 잘하고있는 것 같습니다.

자유롭게 사용해보십시오.

를 대신 사용하면 AppBarLayout확장 또는 축소를 담당하는 메소드를 호출 할 수 있습니다 CollapsingToolbarLayout.

내 프로젝트에서 예상대로 정확하게 작동하지만 perform...메서드 (특히)에서 fling / scroll 값을 조정하여 performExpandingWithAnimation()에 맞출 수 있습니다 CollapsibleToolbarLayout.


@ssdeno는 Github 요지의 Readme.md를 읽으십시오. 지원 라이브러리 v23부터 사용되지 않습니다. Support의 v23 (AndroidX로 진행) 이후에는에 setExpanded메소드가 있습니다 AppBarLayout.
Bartek Lipinski 16:15에

6

사용 mAppBarLayout.setExpanded(true)도구 모음 및 사용을 확대 할 mAppBarLayout.setExpanded(false)도구 모음을 축소 할 수 있습니다.

프로그래밍 방식으로 CollapsingToolbarLayout 높이 를 변경 하려면 mAppBarLayout.setLayoutParams(params);

넓히다:

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*200; // HEIGHT

mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(true);

무너짐:

CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*80; // HEIGHT

mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(false);

1
이것은 나에게 많은 도움이되었습니다.
NONAME

1
이것은 매우 도움이됩니다. 감사합니다!
sunlover3

5

onNestedPreScroll로 작업하고 나 같은 오류를 얻고 싶은 사람들을 위해. 이 줄을 사용하지 않고 onCreate에서 NullPointerException이 발생합니다.

    CoordinatorLayout coordinator =(CoordinatorLayout)findViewById(R.id.tab_maincontent);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
    //below line
    params.setBehavior(new AppBarLayout.Behavior() {});

이것으로 제대로 작동하지 않습니다. 하지만이 문제를 해결합니다.

onCreate에서 :

        scrollToolbarOnDelay();

과...

    public void scrollToolbarOnDelay() {
            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.tab_appbar);
                    CoordinatorLayout coordinator = (CoordinatorLayout) findViewById(R.id.tab_maincontent);
                    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
                    AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
         if(behavior!=null)
                    behavior.onNestedPreScroll(coordinator, appBarLayout, null, 0, 100, new int[]{0, 0});
         else
            scrollToolbarOnDelay()
                }
            }, 100);


        }

1

이 시도...

넓히다

appBarLayout.setExpanded(true, true);

회상

appBarLayout.setExpanded(false, true);

0

확장 또는 축소하는 데 도움이 될 수 있습니다.

appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);

0

나는 이것을 사용하고있다

 private fun collapseAppbar() {
        scrollView.postDelayed(Runnable {
            scrollView?.smoothScrollTo(50, 50)
        }, 400)
    }

0

프로그래밍 방식으로 AppBarLayout을 확장 / 축소하려면

fun expandAppBarLayout(expand: Boolean, isAnimationEnabled: Boolean){
    appBarLayout.setExpanded(expand, isAnimationEnabled);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.