1.アプリケーションバーのレイアウトAppBarLayout関数
アプリケーションバーレイアウトAppBarLayoutは、実際には線形レイアウトLinearLayoutを継承しているため、LinearLayoutのすべてのプロパティとメソッドを備えています。さらに、アプリケーションバーレイアウトの追加機能には、主に次のものがあります。
- ページの本体に応じたスライド動作をサポートします。つまり、ページの本体が上下に移動したときに、AppBarLayoutはページの本体のスクロール操作をキャプチャできます。
- スクロール操作をキャプチャした後、ヘッドコントロール(通常はツールバー)に、高速ヘッドコントロールをどのようにロールするか、ストリート全体をロールするかロールするかを通知する必要があります。
2.上部のナビゲーションバーの動的スクロール効果は、前のステップに固有です。
- appcompat-v7ライブラリ(ツールバーに必要)、デザインライブラリ(AppBarLayoutに必要)、recyclerviewライブラリ(メインページのRecyclerViewに必要)など、build.gradleにいくつかのライブラリのコンパイルサポートを追加します。AndoridX環境を使用している場合は、実装「com.google.android.material:material:1.0.0-rc01」に直接依存してください。
- レイアウトファイルのルートレイアウトはCoordinatorLayoutを採用しています。これは、デザインライブラリの動的効果がコントロールに依存するためです。ノードは、名前空間宣言xmlns:app = "http://schemas.android.com/apk/res-を追加する必要があります。自動」
- AppBarLayoutノードを使用してツールバーノードをラップします。つまり、ツールバーノードをAppBarLayoutノードの従属ノードとして使用します。
- スクロール属性app:layout_scrollFlags = "scroll | enterAlways"をツールバーノードに追加して、ツールバーのスクロール動作フラグを指定します。
- デモインターフェイスの本体はRecyclerViewコントロールを使用し、動作属性をコントロールノードに追加します。つまりapp:layout_behavior = "@ string / appbar_scrolling_view_behavior"です。これは、AppBarLayoutがRecyclerViewのスクロール操作をキャプチャするように通知されることを意味します。
3.RecyclerViewレイアウトファイルのコード例と組み合わせたAppBarLayout
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://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/abl_title"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
android:id="@+id/tl_title"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="#AAAAFF"
app:layout_scrollFlags="scroll|enterAlways" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
item_collapse.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_item"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="#aaffff"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_seq"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:gravity="center"
android:textColor="#000000"
android:textSize="17sp" />
<TextView
android:id="@+id/tv_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="8"
android:gravity="center"
android:textColor="#000000"
android:textSize="17sp" />
</LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
private String[] yearArray = {"鼠年", "牛年", "虎年", "兔年", "龙年", "蛇年",
"马年", "羊年", "猴年", "鸡年", "狗年", "猪年","鼠年", "牛年", "虎年", "兔年", "龙年", "蛇年",
"马年", "羊年", "猴年", "鸡年", "狗年", "猪年","鼠年", "牛年", "虎年", "兔年", "龙年", "蛇年",
"马年", "羊年", "猴年", "鸡年", "狗年", "猪年"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 从布局文件中获取名叫tl_title的工具栏
Toolbar tl_title = findViewById(R.id.tl_title);
// 使用tl_title替换系统自带的ActionBar
setSupportActionBar(tl_title);
// 从布局文件中获取名叫rv_main的循环视图
RecyclerView rv_main = findViewById(R.id.rv_main);
// 创建一个垂直方向的线性布局管理器
LinearLayoutManager llm = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
// 设置循环视图的布局管理器
rv_main.setLayoutManager(llm);
// 构建一个十二生肖的线性适配器
RecyclerCollapseAdapter adapter = new RecyclerCollapseAdapter(this, yearArray);
// 给rv_main设置十二生肖线性适配器
rv_main.setAdapter(adapter);
}
}
RecyclerCollapseAdapter.java
public class RecyclerCollapseAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final static String TAG = "RecyclerCollapseAdapter";
private Context mContext; // 声明一个上下文对象
private String[] mTitleArray; // 标题文字数组
public RecyclerCollapseAdapter(Context context, String[] titleArray) {
mContext = context;
mTitleArray = titleArray;
}
// 获取列表项的个数
public int getItemCount() {
return mTitleArray.length;
}
// 创建列表项的视图持有者
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup vg, int viewType) {
// 根据布局文件item_collapse.xml生成视图对象
View v = LayoutInflater.from(mContext).inflate(R.layout.item_collapse, vg, false);
return new TitleHolder(v);
}
// 绑定列表项的视图持有者
public void onBindViewHolder(RecyclerView.ViewHolder vh, final int position) {
TitleHolder holder = (TitleHolder) vh;
holder.tv_seq.setText("" + (position + 1));
holder.tv_title.setText(mTitleArray[position]);
}
// 获取列表项的类型
public int getItemViewType(int position) {
return 0;
}
// 获取列表项的编号
public long getItemId(int position) {
return position;
}
// 定义列表项的视图持有者
public class TitleHolder extends RecyclerView.ViewHolder {
public LinearLayout ll_item; // 声明列表项的线性布局
public TextView tv_seq; // 声明列表项序号的文本视图
public TextView tv_title; // 声明列表项标题的文本视图
public TitleHolder(View v) {
super(v);
ll_item = v.findViewById(R.id.ll_item);
tv_seq = v.findViewById(R.id.tv_seq);
tv_title = v.findViewById(R.id.tv_title);
}
}
}
4.NestedScrollViewの概要
NestedScrollViewはフレームレイアウトFrameLayoutを継承し、その使用法はScrollViewと同様です。たとえば、両方に直接サブビューが1つだけ必要であり、どちらも内部ビューを上下にスクロールできます。NestedScrollViewのその他の機能は、AppBarLayoutと組み合わせて使用されます。ツールバーのスクロール動作をトリガーすることで、Android5.0の新機能と互換性のあるScrollViewの拡張バージョンと見なすことができます。