IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android中使用PopupWindow实现左右底部弹框窗 -> 正文阅读

[移动开发]Android中使用PopupWindow实现左右底部弹框窗

最近做首页新手引导需要显示一个在控件下面的弹框,由于之前的同事使用的是FramLayout以addview的方式实现的,发现很不好扩展,修改控件位置及其他需求比较麻烦,于是决定用PopupWindow重新写,直接上代码:

1.浮窗显示在控件底部:

调用showAsDropDown()方法,源码翻译出来大致意思就是显示固定位置的视图

2.初始化

Button btnSave, btnClear;
TextView textView;
ConstraintLayout cl_root;
PopupWindow mPopupWindow;
List<VideoDetailModel> detailModelList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    initData();
    initListener();
}

private void initData() {
    detailModelList = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        VideoDetailModel detailModel = new VideoDetailModel();
        detailModel.setTitle("S1 与 Vision+ S1 App 的连接S1");
        detailModel.setPoint("01:10");
        detailModelList.add(detailModel);
    }
}

private void initView() {
    btnSave = findViewById(R.id.btn_save);
    btnClear = findViewById(R.id.btn_clear);
    cl_root = findViewById(R.id.cl_root);
}

?3.浮窗在按钮下面弹出:

btnBottom.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mPopupWindow = new TipPopupWinDow(MainActivity.this, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
        //浮框在按钮下面
        showPopUpWindow(v);
        setBackgroundAlpha(MainActivity.this, 0.6f);
    }
});

private void showPopUpWindow(View v) {
    mPopupWindow.showAsDropDown(v);
    mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
        @Override
        public void onDismiss() {
            setBackgroundAlpha(MainActivity.this, 1.0f);
        }
    });
}

4、浮窗在按钮右边弹出

btnRight.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //浮框在右边
        FullVideoPopupWindow fullVideoPopupWindow = new FullVideoPopupWindow(MainActivity.this,detailModelList,ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
        fullVideoPopupWindow.showAtLocation(v, RIGHT,0, 0);
    }
});

5.浮窗从按钮左边弹出:

btnLeft.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //浮框在左边
        FullVideoPopupWindow fullVideoPopupWindow = new FullVideoPopupWindow(MainActivity.this, detailModelList, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
        fullVideoPopupWindow.showAtLocation(v, Gravity.START,0, 0);
    }
});

6.MainActivity:完整代码:

public class MainActivity extends AppCompatActivity {
    Button btnBottom,btnLeft, btnRight;
    ConstraintLayout cl_root;
    PopupWindow mPopupWindow;
    List<VideoDetailModel> detailModelList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
        initListener();
    }

    private void initData() {
        detailModelList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            VideoDetailModel detailModel = new VideoDetailModel();
            detailModel.setTitle("S1 与 Vision+ S1 App 的连接S1");
            detailModel.setPoint("01:10");
            detailModelList.add(detailModel);
        }
    }

    private void initView() {
        btnBottom = findViewById(R.id.btn_bottom);
        btnLeft = findViewById(R.id.btn_left);
        btnRight = findViewById(R.id.btn_right);
        cl_root = findViewById(R.id.cl_root);
    }

    private void initListener() {
        btnLeft.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //浮框在左边
                FullVideoPopupWindow fullVideoPopupWindow = new FullVideoPopupWindow(MainActivity.this, detailModelList, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
                fullVideoPopupWindow.showAtLocation(v, Gravity.START,0, 0);
            }
        });
        btnBottom.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPopupWindow = new TipPopupWinDow(MainActivity.this, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
                //浮框在按钮下面
                showPopUpWindow(v);
                setBackgroundAlpha(MainActivity.this, 0.6f);
            }
        });
        btnRight.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //浮框在右边
                FullVideoPopupWindow fullVideoPopupWindow = new FullVideoPopupWindow(MainActivity.this,detailModelList,ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
                fullVideoPopupWindow.showAtLocation(v, RIGHT,0, 0);
            }
        });
    }

    public static void setBackgroundAlpha(AppCompatActivity activity, float bgAlpha) {
        WindowManager.LayoutParams lp = activity.getWindow()
                .getAttributes();
        lp.alpha = bgAlpha;
        (activity).getWindow().setAttributes(lp);
    }

    private void showPopUpWindow(View v) {
        mPopupWindow.showAsDropDown(v);
        mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                setBackgroundAlpha(MainActivity.this, 1.0f);
            }
        });
    }
}

?7.布局代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/cl_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_left"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/dp_20"
        android:layout_marginEnd="@dimen/dp_20"
        android:background="@color/colorPrimary"
        android:text="从按钮左边弹出"
        android:textColor="@color/white"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintLeft_toRightOf="@id/btn_bottom"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_bottom"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/dp_20"
        android:background="@color/colorPrimary"
        android:text="从按钮下面弹出"
        android:textColor="@color/white"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toRightOf="@id/btn_left"
        app:layout_constraintRight_toLeftOf="@id/btn_right"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_right"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/dp_20"
        android:layout_marginEnd="@dimen/dp_20"
        android:background="@color/colorPrimary"
        android:text="从按钮右边弹出"
        android:textColor="@color/white"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toRightOf="@id/btn_bottom"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
8.底部弹框代码:
/**
 * @author: njb
 * @date: 2022/2/17 14:53
 * @desc: 引导弹框
 */
public class TipPopupWinDow extends PopupWindow {
    private View view;
    FrameLayout flTip;

    public TipPopupWinDow(Activity context,int width, int height, boolean focusable){
        view = LayoutInflater.from(context).inflate(R.layout.layout_tip_popup_window, null);
        flTip = view.findViewById(R.id.fl_tip);
        setContentView(view);
        setTouchable(true);
        setHeight(height);
        setWidth(width);
        setOutsideTouchable(true);
        initView();
    }

    private void initView() {
        flTip.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TipPopupWinDow.this.dismiss();
            }
        });
    }
}

9.左右弹框代码:

/**
 * @author: njb
 * @date: 2022/3/14 17:39
 * @desc: 描述
 */
public class FullVideoPopupWindow extends PopupWindow {
    private List<VideoDetailModel> videoDetails;
    private RecyclerView recyclerView;
    private FullVideoDetailAdapter fullVideoDetailAdapter;
    private Activity context;
    private View view;
    private LinearLayoutManager centerLayoutManager;
    private ConstraintLayout clVideo;

    public FullVideoPopupWindow(@NonNull Activity context, List<VideoDetailModel> videoDetails,int width,int height) {
        super(context);
        this.context = context;
        this.videoDetails = videoDetails;
        view = LayoutInflater.from(context).inflate(R.layout.popup_full_video, null);
        setContentView(view);
        this.setBackgroundDrawable(null);
        setWidth(width);
        setHeight(height);
        setOutsideTouchable(true);
        setTouchable(true);
        initView();
    }

    private void initView() {
        recyclerView = view.findViewById(R.id.rv_full_video);
        clVideo = view.findViewById(R.id.cl_full_root);
        fullVideoDetailAdapter = new FullVideoDetailAdapter(context,videoDetails);
        centerLayoutManager = new LinearLayoutManager(context,LinearLayoutManager.VERTICAL,false);
        recyclerView.setLayoutManager(new LinearLayoutManager(context));
        recyclerView.setAdapter(fullVideoDetailAdapter);
        clVideo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FullVideoPopupWindow.this.dismiss();
            }
        });
    }
}

10.实现的效果如下:

最后项目的源码如下:PopupWindowDemo: PopUpWindow的简单使用

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:02:21  更:2022-03-21 21:06:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 19:36:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码