Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách sử dụng AppBarLayout trong Android

Giới thiệu

AppBarLayout là container dọc cho Toolbar và các view khác (như TabLayout), hỗ trợ cuộn phối hợp (scrolling behaviors) khi kết hợp với CoordinatorLayout và RecyclerView.

Các bước thực hiện

Bước 1: Thêm dependency (build.gradle)

dependencies {
    implementation "com.android.support:design:28.0.0" // Hoặc androidx
    implementation "com.android.support:recyclerview-v7:28.0.0"
}

Lưu ý: AndroidX thay thế Support Library. Dùng com.google.android.material:material:1.9.0 cho phiên bản mới.

Bước 2: Giao diện chính (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <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/ThemeOverlay.AppCompat.Light" />

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

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

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

Giải thích quan trọng:

  • app:layout_scrollFlags="scroll|enterAlways": Toolbar cuộn lên ẩn, cuộn xuống hiện ngay.
  • app:layout_behavior="@string/appbar_scrolling_view_behavior": RecyclerView báo cho AppBarLayout biết khi nào cuộn.

Bước 3: Item RecyclerView (res/layout/list_row.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp" />

</LinearLayout>

Bước 4: Adapter (src/CustomAdapter.java)

package com.example.myapplication;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {

    private List<String> data;
    private Context context;

    public CustomAdapter(Context context, List<String> data) {
        this.context = context;
        this.data = data;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.list_row, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.title.setText(data.get(position));
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView title;
        ViewHolder(View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.title);
        }
    }
}

Bước 5: MainActivity.java

package com.example.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = findViewById(R.id.toolbar);
        toolbar.setTitle("AppBarLayout Demo");
        setSupportActionBar(toolbar);

        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        List<String> items = new ArrayList<>();
        for (int i = 1; i <= 30; i++) {
            items.add("Item " + i);
        }

        recyclerView.setAdapter(new CustomAdapter(this, items));
    }
}

Bước 6: Manifest & Theme

Đảm bảo theme không có ActionBar mặc định:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">#3F51B5</item>
    <item name="colorPrimaryDark">#303F9F</item>
    <item name="colorAccent">#FF4081</item>
</style>

Chạy ứng dụng

Nhấn Run. Toolbar sẽ ẩn/hiện mượt mà khi cuộn RecyclerView lên/xuống.

Cách sử dụng AppBarLayout trong Android

Cách sử dụng AppBarLayout trong Android

Các flag cuộn (scrollFlags) phổ biến

FlagHành vi
scrollCuộn cùng nội dung
enterAlwaysHiện ngay khi cuộn xuống
enterAlwaysCollapsedHiện thu gọn, kéo thêm mới hiện đầy đủ
exitUntilCollapsedCuộn lên ẩn cho đến khi còn height tối thiểu
snapTự động "bật" về trạng thái ẩn/hiện gần nhất