[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"
재정의 해야합니다 .onAttach
onDetach
FrameLayout
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
처럼 행동 해야하는는 ActionBar
a Activity
또는 a Fragment
? 다양한 질문과 문서를 검색했지만 모든 사례를 다루는 솔루션을 찾을 수 없었습니다. 그러므로 그것은 당신의 상황에 달려 있습니다.
사례 1 : 툴바는 ActionBar를 대체해야합니다.
툴바가 일반 ActionBar처럼 작동해야하는 경우 (또는 때때로 최대 1 개의 조각이 표시되는 경우), 가장 좋은 / 간단한 방법은 기존 Activities
의 툴바 를 사용 하고 거기에 조각을 넣는 것입니다. 이렇게하면 툴바를 언제 표시해야하는지 걱정할 필요가 없습니다.
Fragments에서 ActionBar (-behaviour)를 변경하는 것도 가능하지만 어떤 Fragment가 언제 ActionBar를 변경했는지 추적해야하므로 권장하지 않습니다. ActionBar를 여러 번 설정할 수 있는지조차 모르겠습니다.
사례 2 : 각 조각에는 자체 (일부) 도구 모음이 있어야합니다.
또한 다른 프래그먼트에 다른 독립형 도구 모음을 자체 작업과 함께 배치하도록 선택할 수도 있습니다. 이렇게하면 서로 다른 프래그먼트를 나란히 표시 할 수 있습니다. 각 프래그먼트는 각각의 작업을 툴바에 표시하고 1 개의 툴바라고 제안 할 수 있습니다 (확실하지 않지만 Gmail 앱과 비슷할 수 있음). 그러나 이는 사용자가 직접 도구 모음을 부풀려 야하지만 그리 어렵지 않아야 함을 의미합니다.
이것이 선택에 도움이되기를 바랍니다.
(내가 (언어) 실수를했다면 죄송합니다)