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ác flag cuộn (scrollFlags) phổ biến
| Flag | Hành vi |
|---|---|
scroll | Cuộn cùng nội dung |
enterAlways | Hiện ngay khi cuộn xuống |
enterAlwaysCollapsed | Hiện thu gọn, kéo thêm mới hiện đầy đủ |
exitUntilCollapsed | Cuộn lên ẩn cho đến khi còn height tối thiểu |
snap | Tự động "bật" về trạng thái ẩn/hiện gần nhất |