Bố cục của Người điều phối với Thanh công cụ trong các Phân đoạn hoặc Hoạt động


94

Với thư viện thiết kế mới, có một số bố cục mới thay đổi rất nhiều cách thanh công cụ có thể hoạt động nếu nhà phát triển muốn. Vì các phân đoạn khác nhau có các hành vi và mục tiêu khác nhau, ví dụ: phân đoạn thư viện có thanh công cụ thu gọn hiển thị ảnh quan trọng hoặc phân đoạn không có chế độ xem cuộn chỉ không cần appbarlayout để ẩn thanh công cụ, việc có một thanh công cụ duy nhất trong hoạt động có thể chứng minh khó khăn.

Vì vậy, với điều này, tôi có nên di chuyển thanh công cụ đến từng phân đoạn không? Nếu vậy, tôi phải đặt supportActionBar mỗi khi tôi hiển thị một phân đoạn và cũng có một tham chiếu về hoạt động trong phân đoạn đó làm vô hiệu bản chất độc lập của các phân đoạn. Nếu tôi để thanh công cụ trong Activity một mình, tôi phải có nhiều bố cục được xác định cho từng loại hành vi trong mỗi phân đoạn. Cách tiếp cận tốt nhất sẽ là gì?


1
Chào bạn, bạn đã tìm ra giải pháp chưa?
SERG

2
cho dự án hiện tại của tôi, tôi đã quyết định gắn bó với thanh công cụ trong Activity và thực hiện các hoạt ảnh thích hợp khi được yêu cầu. Nhưng nó là một chút phức tạp. Tôi đã thử sử dụng thanh công cụ trong từng phân đoạn và nó hoạt động tốt, nhưng việc tạo hoạt ảnh thanh công cụ giữa các chuyển đổi phân đoạn khó hơn và tôi thậm chí không biết liệu có thể thực hiện được không vì tôi không có nhiều kinh nghiệm về hoạt ảnh chuyển đổi phân đoạn.
mobilepotato7

bất kỳ bản cập nhật hoặc giải pháp tốt hơn cho điều này bây giờ?
Sagar Nayak,

Câu trả lời:


56

Đối với tôi, nghe có vẻ quá kỳ lạ khi có thanh ứng dụng và thanh công cụ trong mỗi đoạn. Vì vậy, tôi đã chọn để có một thanh ứng dụng duy nhất với thanh công cụ đang hoạt động.

Để giải quyết vấn đề đó với CoordinatorLayout, bạn sẽ phải thiết lập các hành vi khác nhau của bạn FrameLayout(hoặc bất kỳ Bố cục nào khác) để giữ các đoạn từ mỗi đoạn mà bạn muốn ghi đè hành vi mặc định.

Hãy giả sử rằng hành vi mặc định của bạn là app:layout_behavior="@string/appbar_scrolling_view_behavior"

Sau đó, tronggment_activity_layout.xml của bạn, bạn có thể có một cái gì đó giống như vậy:

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

Và trong mỗi phân đoạn bạn không muốn triển khai, app:layout_behavior="@string/appbar_scrolling_view_behavior"bạn sẽ phải ghi đè onAttachonDetachcác phương thức sẽ thay đổi hành vi của bạn 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;
}

Sau đó CoordinatorLayout sẽ không thu gọn thanh ứng dụng, v.v. và sẽ cho phép bố cục phân đoạn có chiều cao đầy đủ.


Tốt lắm, sẽ phải thử cái này và xem nó có đơn giản hóa mọi thứ không. Cảm ơn.
mobilepotato7

Nếu bạn tìm thấy thứ gì đó đơn giản hơn - hãy cho tôi biết. Tôi nghĩ rằng có thể thay đổi hành vi của người điều phối bất kỳ lúc nào trong vòng đời của các mảnh (ví dụ: bạn thường có một người tái chế với một số thứ nhưng trong một số trường hợp hiếm hoi, nó có thể trống và bạn sẽ biết rằng chỉ sau Trình tải onLoadFinished, có thể bạn thích hiển thị hình ảnh chính giữa thông báo rằng không có gì ở đây, giống như trong Ứng dụng hộp thư đến), nhưng tôi chưa thử điều đó. Có lẽ muộn hơn ngày hôm nay.
Клаус Шварц

Ok, nó hoạt động khá tốt. Tôi đã có một trình trợ giúp chăm sóc việc bật / tắt điều phối viên khi thích hợp, vì vậy tôi chỉ gọi enableCoordinator(Activity activity)/ disableCoordinator(Activity activity)từ các phân đoạn.
Клаус Шварц

Người trợ giúp của bạn ở đâu, @ алаусаварц? Khi nào bạn gọi nó?
santhyago

1
@santhyago Trong mảnh vỡ
Клаус Шварц

8

Đây là giải pháp của tôi

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

Đây là một câu hỏi thực sự hay: liệu Toolbarcó cần phải hoạt động giống như ActionBarđược giữ trong a Activityhay a Fragment? Sau khi tìm kiếm các câu hỏi và tài liệu khác nhau, tôi không thể tìm thấy giải pháp phù hợp với tất cả các trường hợp. Do đó, nó thực sự phụ thuộc vào tình hình của bạn mà bạn phải đi.

Trường hợp 1: Thanh công cụ phải thay thế ActionBar

Nếu Thanh công cụ phải hoạt động giống như một Thanh hành động bình thường (hoặc nếu tối đa 1 phân đoạn được hiển thị theo thời gian), tôi nghĩ cách tốt nhất / đơn giản nhất là sử dụng truyền thống Activitiesvới Thanh công cụ riêng và đặt Phân đoạn của bạn vào đó. Bằng cách này, bạn không phải lo lắng về việc Thanh công cụ nào phải được hiển thị.

Cũng có thể thay đổi ActionBar (-behaviour) từ Fragment, nhưng tôi không khuyên bạn nên thực hiện nó, vì điều đó buộc bạn phải theo dõi Fragment nào đã thay đổi ActionBar khi nào. Tôi thậm chí không biết liệu việc đặt ActionBar có thể được thực hiện nhiều lần hay không.

Trường hợp 2: Mỗi Fragment phải có (một phần của) Thanh công cụ riêng

Bạn cũng có thể chọn đặt các Thanh công cụ độc lập khác nhau trong các Phân đoạn khác nhau, với các hành động của riêng chúng. Bằng cách này, bạn có thể hiển thị các Phân đoạn khác nhau bên cạnh nhau - mỗi phân đoạn có hành động riêng trong Thanh công cụ - và đề xuất rằng đó là 1 Thanh công cụ (có thể giống như ứng dụng Gmail, mặc dù tôi không chắc). Tuy nhiên, điều này có nghĩa là bạn sẽ phải tự mình tăng các Thanh công cụ đó lên, nhưng không khó lắm.

Tôi hy vọng điều này sẽ giúp đưa ra lựa chọn.

(Xin lỗi nếu tôi mắc bất kỳ lỗi (ngôn ngữ-) nào)


4
xin lỗi nhưng điều này không thực sự giải đáp các vấn đề liên quan đến thư viện thiết kế mới. Chắc chắn việc có thanh công cụ làm thanh hành động là mục tiêu, nhưng có nhiều bố cục điều phối cho các loại thanh công cụ khác nhau có thể khó khăn. Những gì tôi nhận thấy là có thể tạo hiệu ứng cho thanh công cụ khi cần thiết. Tôi vẫn cần phải kiểm tra nó tốt hơn nhưng có vẻ như đó là kết quả tốt
mobilepotato7
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.