android 底部抽屉 BottomSheet+CoordinatorLayout 实现 AndroidX版本

android 底部抽屉 BottomSheet+CoordinatorLayout 实现 AndroidX版本

activity_coordinator.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:id="@+id/cl_chouti"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <RelativeLayout
            android:id="@+id/bottom_sheet"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            app:behavior_hideable="false"
            app:behavior_peekHeight="60dp"
            app:layout_behavior="@string/bottom_sheet_behavior">
                <include layout="@layout/poi_detail_bottom" />
        </RelativeLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

CoordinatorActivity.java
package com.wdkh.dw.GPS.activity;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Context;
import android.graphics.Point;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.wdkh.dw.GPS.model.adapter.CarListAdapter;
import com.wdkh.dw.GPS.model.adapter.CoListAdapter;
import com.wdkh.dw.GPS.utils.DeviceUtils;
import com.wdkh.dw.R;

import java.util.ArrayList;
import java.util.List;

public class CoordinatorActivity extends AppCompatActivity {

    //底部抽屉中的自定义布局
    private RecyclerView recycler_view;
    //抽屉的主view
    private View bottomSheet;
    //抽屉view的id
    private LinearLayout chou_ti_id;

    private BottomSheetBehavior<View> behavior;
    private List<String> carList = new ArrayList<>();



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_coordinator);
        //设置抽屉最大高度
        chou_ti_id = findViewById(R.id.chou_ti_id);
        ViewGroup.LayoutParams para;
        para = chou_ti_id.getLayoutParams();
        int height1 = (int) (getResources().getDisplayMetrics().heightPixels * 0.7);
        para.height=height1;
        chou_ti_id.setLayoutParams(para);
        //底部抽屉栏展示地址
        bottomSheet = findViewById(R.id.bottom_sheet);
        behavior = BottomSheetBehavior.from(bottomSheet);
        int height = (int) (getResources().getDisplayMetrics().heightPixels * 0.2);
        behavior.setPeekHeight(height);
       // bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); 设置展开折叠的默认状态
        behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
            @Override
            public void onStateChanged(@NonNull View bottomSheet, @BottomSheetBehavior.State int newState) {
                String state = "null";
                switch (newState) {
                    case 1:
                        state = "STATE_DRAGGING";//过渡状态此时用户正在向上或者向下拖动bottom sheet

                        break;
                    case 2:
                        state = "STATE_SETTLING"; // 视图从脱离手指自由滑动到最终停下的这一小段时间
                        break;
                    case 3:
                        state = "STATE_EXPANDED"; //处于完全展开的状态

                        break;
                    case 4:
                        state = "STATE_COLLAPSED"; //默认的折叠状态
                        break;
                    case 5:
                        state = "STATE_HIDDEN"; //下滑动完全隐藏 bottom sheet
                        break;
                }

            }

            //实时返回滚动数据
            @Override
            public void onSlide(@NonNull View bottomSheet, float slideOffset) {
                Log.d("BottomSheetDemo", "slideOffset:" + slideOffset);
            }
        });

        //用于测试的列表数据
        recycler_view = findViewById(R.id.recycler_view);
        List<String> strList = new ArrayList<>();
        for(int i = 0;i<100;i++){
            strList.add("fffff"+i);
        }

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recycler_view.setLayoutManager(layoutManager);
        CoListAdapter adapter = new CoListAdapter(strList, this);
        recycler_view.setAdapter(adapter);
        adapter.setOnItemClickListener(postion -> {
            String chepaihao = carList.get(postion)+"";

            Log.e("点击", "onItemLongClick: ");

        });
    }
}
poi_detail_bottom.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/chou_ti_id"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ffffff"
    android:orientation="vertical">
    <TextView
        android:id="@+id/tv_tishi"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="40dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="附近热点"
        android:textSize="10sp"/>
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>
CoListAdapter.java
package com.wdkh.dw.GPS.model.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.wdkh.dw.GPS.model.domain.OrderDomain;
import com.wdkh.dw.R;

import java.util.List;

public class CoListAdapter extends RecyclerView.Adapter<CoListAdapter.ViewHolder>{
    private List<String> mOrderList;
    private Context mContext;

    //初始化list_item组件
    static class ViewHolder extends RecyclerView.ViewHolder {
        View fruitView;
        LinearLayout rank_item_banck;
        TextView chepaihao;
        ImageView icon;
        public ViewHolder(View view) {
            super(view);
            fruitView = view;
            rank_item_banck = view.findViewById(R.id.rank_item_banck);
            chepaihao = view.findViewById(R.id.chepaihao);//车牌号
         /*   ZhuangTai = view.findViewById(R.id.ZhuangTai);//车辆审核状态*/
            icon = view.findViewById(R.id.icon);
        }
    }
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.car_list_item, parent, false);
        final ViewHolder holder = new ViewHolder(view);
        return holder;
    }
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        String cph = mOrderList.get(position);
        holder.chepaihao.setText(cph);
        /*holder.ZhuangTai.setText(cph.drivrName);*/


    }
    @Override
    public int getItemCount() {
        return mOrderList.size();
    }
    public CoListAdapter(List OrderReceivedList, Context context) {
        mOrderList=OrderReceivedList;
        this.mContext =context;
    }
    private String getStatus(int state){
        String stateStr = "";
        switch (state){
            case 1:
                stateStr = "待核查";
                break;
            case 2:
                stateStr = "核查通过";
                break;
            default:
                stateStr = "待核查";
                break;
        }
        return stateStr;
    }
    //点击回到多态实现
    OnItemClickListener mClickListener;
    public interface OnItemClickListener {
        void onItemClick(int postion);
    }
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.mClickListener = listener;
    }
}

在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android 中,可以使用抽屉(Drawer)来实现一个位于屏幕底部的可滑动菜单。你可以使用 `DrawerLayout` 和 `NavigationView` 组件来创建底部抽屉。 首先,在你的项目的 build.gradle 文件中添加以下依赖项: ```groovy implementation 'androidx.drawerlayout:drawerlayout:1.1.1' ``` 然后,在你的布局文件中添加以下代码: ```xml <androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 主要内容布局 --> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 主要内容视图 --> </LinearLayout> <!-- 底部抽屉布局 --> <com.google.android.material.navigation.NavigationView android:id="@+id/navigation_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom"> <!-- 抽屉内容视图 --> </com.google.android.material.navigation.NavigationView> </androidx.drawerlayout.widget.DrawerLayout> ``` 在代码中,你需要将主要内容布局放置在 `DrawerLayout` 内,并将底部抽屉布局放置在 `NavigationView` 内。通过设置 `android:layout_gravity="bottom"` 属性,将底部抽屉设置为位于屏幕底部。 接下来,在你的 Activity 中,你需要获取 `DrawerLayout` 和 `NavigationView` 的引用,并设置相关的滑动操作和点击事件监听器: ```java import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.drawerlayout.widget.DrawerLayout; import com.google.android.material.navigation.NavigationView; public class MainActivity extends AppCompatActivity { private DrawerLayout drawerLayout; private NavigationView navigationView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); drawerLayout = findViewById(R.id.drawer_layout); navigationView = findViewById(R.id.navigation_view); // 创建 ActionBarDrawerToggle 对象,用于处理抽屉的打开和关闭操作 ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawerLayout, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawerLayout.addDrawerListener(toggle); toggle.syncState(); // 设置 NavigationView 的菜单项点击事件监听器 navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { // 处理菜单项点击事件 return true; } }); } // 在需要打开抽屉时调用 private void openDrawer() { drawerLayout.openDrawer(GravityCompat.END); } // 在需要关闭抽屉时调用 private void closeDrawer() { drawerLayout.closeDrawer(GravityCompat.END); } } ``` 通过调用 `openDrawer()` 方法可以打开底部抽屉,调用 `closeDrawer()` 方法可以关闭底部抽屉。你可以根据自己的需求在菜单项点击事件监听器中处理相关逻辑。 注意,上述代码中的 `R.string.navigation_drawer_open` 和 `R.string.navigation_drawer_close` 是用于指定抽屉打开和关闭时的提示文本,你可以根据需要进行替换。 希望这可以帮助你创建一个底部抽屉
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈攻城狮s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值