조각 또는 활동에 도구 모음이있는 코디네이터 레이아웃


94

새로운 디자인 라이브러리에는 개발자가 원하는 경우 도구 모음의 동작 방식을 많이 변경하는 몇 가지 새로운 레이아웃이 있습니다. 예를 들어 중요한 사진을 보여주는 축소 도구 모음이있는 갤러리 조각 또는 도구 모음을 숨기는 데 앱바 레이아웃이 필요하지 않은 스크롤 뷰가없는 조각과 같이 조각마다 동작과 목표가 다르기 때문에 활동에 단일 도구 모음이 있으면 어렵습니다.

그럼 이것으로 툴바를 각 조각으로 옮겨야할까요? 그렇다면 조각을 표시 할 때마다 supportActionBar를 설정해야하며 조각의 독립적 인 특성을 무효화하는 조각의 활동에 대한 참조도 있어야합니다. 활동에 도구 모음을 그대로두면 각 조각의 각 동작 유형에 대해 여러 레이아웃을 정의해야합니다. 최선의 접근 방법은 무엇입니까?


1
안녕하세요, 해결책을 찾았습니까?
SERG

2
현재 프로젝트에서는 활동의 도구 모음을 사용하고 필요할 때 적절한 애니메이션을 수행하기로 결정했습니다. 그러나 그것은 약간 복잡합니다. 각 조각에서 도구 모음을 사용해 보았지만 제대로 작동하지만 조각 전환 사이의 도구 모음 애니메이션이 더 어렵고 조각 전환 애니메이션에 대한 경험이 많지 않기 때문에 가능한지조차 모릅니다.
mobilepotato7

지금 이것에 대한 업데이트 또는 더 나은 솔루션이 있습니까?
Sagar Nayak

답변:


56

저에게는 각 조각에 앱 바와 툴바가있는 것이 너무 이상하게 들립니다. 그래서 저는 활동에 툴바가있는 단일 앱 바를 선택했습니다.

CoordinatorLayout으로이 문제를 해결하려면 FrameLayout기본 동작을 재정의하려는 각 조각의 조각을 보유해야하는 사용자 (또는 다른 레이아웃) 의 다른 동작을 설정 해야합니다.

기본 동작이 app:layout_behavior="@string/appbar_scrolling_view_behavior"

그런 다음 fragment_activity_layout.xml에 다음과 같은 내용이있을 수 있습니다.

<android.support.design.widget.CoordinatorLayout
    android:id="@+id/coordinator"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
            android:id="@+id/dashboard_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.Toolbar"
            app:layout_scrollFlags="scroll|enterAlways"/>
    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/dashboard_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>

그리고 구현하지 않으려는 각 조각에서 다음 동작을 변경하는 메서드 와 app:layout_behavior="@string/appbar_scrolling_view_behavior"재정의 해야합니다 .onAttachonDetachFrameLayout

CoordinatorLayout.Behavior behavior;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    if(behavior != null)
        return;

    FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();

    behavior = params.getBehavior();
    params.setBehavior(null);

}

@Override
public void onDetach() {
    super.onDetach();
    if(behavior == null)
        return;

    FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();

    params.setBehavior(behavior);

    layout.setLayoutParams(params);

    behavior = null;
}

그 후에 CoordinatorLayout은 앱바 등을 축소하지 않으며 조각 레이아웃을 전체 높이로 허용합니다.


좋은 사람은 이것을 시도하고 그것이 일을 단순화하는지 확인해야 할 것입니다. 감사.
mobilepotato7 2015-08-16

더 간단한 것을 찾으면 알려주세요. 프래그먼트의 수명주기 동안 언제든지 코디네이터 동작을 변경할 수 있다고 생각합니다 (예 : 일반적으로 일부 리사이클 러가 있지만 드물게 비어있을 수 있으며 Loader 's 이후에만 onLoadFinished가능하다는 것을 알 수 있습니다. Inbox 앱처럼 여기에 아무것도 없다는 것을 알리는 중앙 이미지를 표시하고 싶지만 아직 시도하지 않았습니다. 아마도 오늘 나중에.
Клаус Шварц

좋습니다. 잘 작동합니다. 적절한 경우 코디네이터를 활성화 / 비활성화하는 도우미를 cr8ted했기 때문에 조각에서 enableCoordinator(Activity activity)/ 호출 disableCoordinator(Activity activity)합니다.
Клаус Шварц aug.

당신의 도우미 @ КлаусШварц는 어디 있습니까? 언제 전화합니까?
santhyago

1
조각 위치에서 @santhyago
Клаус Шварц에게

8

내 해결책은 다음과 같습니다.

<!-- Put your fragment inside a Framelayout and set the behavior for this FrameLayout -->
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <!-- Your fragment -->
    <include layout="@layout/content_main" />

</FrameLayout>

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>


1

이것은 정말 좋은 질문입니다. Toolbar처럼 행동 해야하는는 ActionBara Activity또는 a Fragment? 다양한 질문과 문서를 검색했지만 모든 사례를 다루는 솔루션을 찾을 수 없었습니다. 그러므로 그것은 당신의 상황에 달려 있습니다.

사례 1 : 툴바는 ActionBar를 대체해야합니다.

툴바가 일반 ActionBar처럼 작동해야하는 경우 (또는 때때로 최대 1 개의 조각이 표시되는 경우), 가장 좋은 / 간단한 방법은 기존 Activities의 툴바 를 사용 하고 거기에 조각을 넣는 것입니다. 이렇게하면 툴바를 언제 표시해야하는지 걱정할 필요가 없습니다.

Fragments에서 ActionBar (-behaviour)를 변경하는 것도 가능하지만 어떤 Fragment가 언제 ActionBar를 변경했는지 추적해야하므로 권장하지 않습니다. ActionBar를 여러 번 설정할 수 있는지조차 모르겠습니다.

사례 2 : 각 조각에는 자체 (일부) 도구 모음이 있어야합니다.

또한 다른 프래그먼트에 다른 독립형 도구 모음을 자체 작업과 함께 배치하도록 선택할 수도 있습니다. 이렇게하면 서로 다른 프래그먼트를 나란히 표시 할 수 있습니다. 각 프래그먼트는 각각의 작업을 툴바에 표시하고 1 개의 툴바라고 제안 할 수 있습니다 (확실하지 않지만 Gmail 앱과 비슷할 수 있음). 그러나 이는 사용자가 직접 도구 모음을 부풀려 야하지만 그리 어렵지 않아야 함을 의미합니다.

이것이 선택에 도움이되기를 바랍니다.

(내가 (언어) 실수를했다면 죄송합니다)


4
미안하지만 이것은 새로운 디자인 라이브러리와 관련된 문제에 실제로 대답하지 않습니다. 툴바를 액션 바로 사용하는 것이 목표이지만 다양한 유형의 툴바에 대해 여러 코디네이터 레이아웃을 사용하는 것은 까다로울 수 있습니다. 내가 찾은 것은 필요에 따라 도구 모음을 애니메이션 할 수 있다는 것입니다. 나는 아직도 더 나은 그것을 테스트해야하지만 좋은 결과가있을 것 같다
mobilepotato7가
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.