AppBarLayout के साथ कॉलैप्सिंग टूलबार
AppBarLayout (डिज़ाइन लाइब्रेरी / Material Components) एक वर्टिकल LinearLayout है जो स्क्रॉल जेस्चर पर प्रतिक्रिया करता है—टूलबार को कॉलैप्स/एक्सपैंड करना, दृश्य पिन करना, आदि। इसके लिए CoordinatorLayout रूट और स्क्रॉल करने योग्य चाइल्ड (RecyclerView, NestedScrollView) की आवश्यकता होती है।
निर्भरताएं (build.gradle)
dependencies {
implementation "com.google.android.material:material:1.11.0"
implementation "androidx.recyclerview:recyclerview:1.3.2"
}
लेआउट (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.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">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="200dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
app:title="कॉलैप्सिंग टूलबार"
app:expandedTitleGravity="center"
app:contentScrim="?attr/colorPrimary">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/hero_image"
app:layout_collapseMode="parallax" />
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin" />
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
गतिविधि (MainActivity.java)
package com.example.appbardemo;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
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);
setSupportActionBar(toolbar);
RecyclerView rv = findViewById(R.id.recyclerView);
rv.setLayoutManager(new LinearLayoutManager(this));
rv.setAdapter(new SimpleAdapter(generateItems(30)));
}
private List generateItems(int count) {
List list = new ArrayList<>();
for (int i = 1; i <= count; i++) list.add("आइटम " + i);
return list;
}
// सरल एडॉप्टर
private static class SimpleAdapter extends RecyclerView.Adapter {
private final List data;
SimpleAdapter(List d) { this.data = d; }
@Override public VH onCreateViewHolder(android.view.ViewGroup p, int v) {
android.view.View view = android.view.LayoutInflater.from(p.getContext())
.inflate(android.R.layout.simple_list_item_1, p, false);
return new VH(view);
}
@Override public void onBindViewHolder(VH h, int i) { h.text.setText(data.get(i)); }
@Override public int getItemCount() { return data.size(); }
static class VH extends RecyclerView.ViewHolder {
android.widget.TextView text;
VH(android.view.View v) { super(v); text = v.findViewById(android.R.id.text1); }
}
}
}
मुख्य स्क्रॉल फ्लैग्स
| फ्लैग | व्यवहार |
|---|---|
scroll | स्क्रॉल ऑफसेट के साथ दृश्य चलता है |
exitUntilCollapsed | न्यूनतम ऊंचाई (टूलबार) तक कॉलैप्स होता है |
enterAlways | नीचे स्क्रॉल करने पर तुरंत एक्सपैंड होता है |
snap | मध्यवर्ती स्थिति में स्नैप होता है |
parallax | (CollapsingToolbarLayout पर) पृष्ठभूमि धीमी गति से चलती है |
pin | (टूलबार पर) कॉलैप्स होने पर टूलबार को शीर्ष पर पिन करता है |
सामान्य नुकसान
- RecyclerView में नेस्टेड स्क्रॉलिंग गायब: सुनिश्चित करें कि
app:layout_behavior="@string/appbar_scrolling_view_behavior"सेट है। - टूलबार पिन नहीं हो रहा: टूलबार पर
app:layout_collapseMode="pin"की आवश्यकता है। - स्थिति बार रंग: स्टेटस बार के लिए
android:statusBarColor="@android:color/transparent"और थीम मेंwindowDrawsSystemBarBackgroundsसेट करें।
मूल उदाहरण की समीक्षा
मूल कोड लिगेसी android.support.design पैकेज, हार्डकोडेड रंगों और एक अधूरे एडॉप्टर का उपयोग करता था। ऊपर दिया गया संस्करण Material Components (androidx), उचित CollapsingToolbarLayout, और एक कार्यशील RecyclerView का उपयोग करता है।