AndroidアプリケーションバーのレイアウトAppBarLayout関連の知識ポイント

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の拡張バージョンと見なすことができます。

おすすめ

転載: blog.csdn.net/weixin_38322371/article/details/114978167