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

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

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



답변

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

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은 앱바 등을 축소하지 않으며 조각 레이아웃을 전체 높이로 허용합니다.


답변

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

<!-- 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>


답변

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

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

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

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

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

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

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

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


답변