PopupWindow的二级菜单的简单demo

popupwindow 的二级联动菜单、ListView形式菜单、GridView形式菜单的Util popupwindow下拉布局为:listView、Gridview、二级菜单listview。将其写成Util类,只要将数据源和在哪个控件弹出的对象传入就可以直接引用并且设置item的点击事件。 立即下载


MainActivity.java

package tech.androidstudio.threelevelpopupwindowsimpledemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView mClickMe;
    private ArrayList<Item> mItemsList;
    private int firstItemPosition;


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

        mClickMe = (TextView)findViewById(R.id.main_clickMe);
        mClickMe.setOnClickListener(this);

        mItemsList = new ArrayList<Item>();
        ArrayList<String> list_HangZhou = new ArrayList<>();
        list_HangZhou.add("哈里哈里配送中心");
        list_HangZhou.add("冷冻配送中心");
        list_HangZhou.add("饮料配送中心");

        Item item_HangZhou = new Item("杭州市场",list_HangZhou);
        mItemsList.add(item_HangZhou);


        ArrayList<String> list_XiaoShan = new ArrayList<>();
        list_XiaoShan.add("萧山配送中心");
        list_XiaoShan.add("萧山冷冻配送中心");
        list_XiaoShan.add("萧山配送中心");

        Item item_XiaoShan = new Item("萧山滨江站市场",list_XiaoShan);
        mItemsList.add(item_XiaoShan);

    }

    /**处理点击的事件,弹出第一级的popupWindow*/
    @Override
    public void onClick(View v) {
        PopupWindow firstPopupWindow = new PopupWindow(this);

        ListView firstListView = new ListView(this);
        firstListView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

        //获取第一级别的Item的名字的列表
        final ArrayList<String> firstItemNameList = new ArrayList<String>();
        for (int i = 0; i < mItemsList.size(); i++) {
            firstItemNameList.add(mItemsList.get(i).getName());
        }
        ArrayAdapter<String> firstAdapter = new ArrayAdapter<String>(this,R.layout.item_layout,firstItemNameList);
        firstListView.setAdapter(firstAdapter);

        //设置fristListView 到popupWindow里面
        firstPopupWindow.setContentView(firstListView);

        firstPopupWindow.setOutsideTouchable(true);
        firstPopupWindow.setTouchable(true);
        firstPopupWindow.setFocusable(true);

        //一定要设置这个宽和高,不然没有宽度和高度就显示不出来的
        firstPopupWindow.setHeight(v.getHeight()*mItemsList.size());
        firstPopupWindow.setWidth(v.getWidth());

        //获取点击的控件的在屏幕中的位置
        int[] location = new int[2];
        v.getLocationOnScreen(location);

        firstPopupWindow.showAtLocation(v, Gravity.NO_GRAVITY, location[0] +v.getWidth(),location[1]);

        //给这个firstListView 添加点击事件,弹出二级菜单
        firstListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                firstItemPosition =position;

                PopupWindow secondPopupWindow = new PopupWindow(MainActivity.this);//注意这里是用的MainActivity.this
                ListView secondListView = new ListView(MainActivity.this);
                secondListView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

                final ArrayList<String> secondItemList = mItemsList.get(position).getSubItemList();
                ArrayAdapter<String> secondAdapter = new ArrayAdapter<String>(MainActivity.this,R.layout.item_layout,secondItemList);
                secondListView.setAdapter(secondAdapter);

                secondPopupWindow.setContentView(secondListView);
                secondPopupWindow.setFocusable(true);
                secondPopupWindow.setTouchable(true);
                secondPopupWindow.setOutsideTouchable(true);

                secondPopupWindow.setHeight(view.getHeight() * secondItemList.size());
                secondPopupWindow.setWidth(view.getWidth());

                int[] secondLocation = new int[2];
                view.getLocationOnScreen(secondLocation);

                //注意这里的不要使用view,而要使用mClickMe,不然会如下的报错
                //android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@41947150 is not valid; is your activity running?

                secondPopupWindow.showAtLocation(mClickMe,Gravity.NO_GRAVITY,secondLocation[0]+view.getWidth(),secondLocation[1]);


                //最后给secondListView 添加一个点击事件的
                secondListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        String secondItemName = secondItemList.get(position);
                        String firstItemName = firstItemNameList.get(firstItemPosition);
                        String toastText = "Clicked 第一级:" + firstItemName + " 第二级别:" + secondItemName;
                        Toast.makeText(MainActivity.this, toastText,Toast.LENGTH_SHORT).show();
                        Log.d("kodulf",toastText);

                    }
                });
            }
        });
    }

    //为了实现二级菜单需要有一个类Item,里面有一个list是subItem
    public class Item {
        private String name;
        private ArrayList<String> subItemList;

        public Item(String name, ArrayList<String> subItemList) {
            this.name = name;
            this.subItemList = subItemList;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public ArrayList<String> getSubItemList() {
            return subItemList;
        }

        public void setSubItemList(ArrayList<String> subItemList) {
            this.subItemList = subItemList;
        }

        @Override
        public String toString() {
            return "Item{" +
                    "name='" + name + '\'' +
                    ", subItemList=" + subItemList +
                    '}';
        }
    }
}



activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"  tools:context=".MainActivity">

    <TextView
        android:id="@+id/main_clickMe"
        android:text="切换市场"
        android:gravity="center"
        android:background="@android:color/holo_blue_light"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:textSize="12sp"
        android:clickable="true"/>
</RelativeLayout>

item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:id="@+id/text_item"
    android:textSize="12sp"
    android:gravity="center"
    android:background="@android:color/holo_green_light">

</TextView>



 PopupWindow的二级菜单的简单demo

 

简单的popupWindow的demo


 

Popupwindow的动画的设置


使用PopupWindow + 2个ListView实现仿 美团/淘宝/百度糯米 多级分类菜单效果 立即下载

相关推荐

android 多级菜单经典demo

android 多级菜单经典demo;开发环境 android studio 具体见blog: http://blog.csdn.net/q610098308/article/details/50333387

用popup实现右键多级菜单

网上已经有很多实现右键菜单的文章,本菜单也是在参考网上的经验之后写成。如有好的意见和建议欢迎留言本菜单的特点:1、可动态添加菜单项和子菜单2、可用css控制菜单表现菜单样式如下: 代码如下:popmenu.css .menuMain {  font-size: 12p;  background: #ffffff;     BORDER-RIGHT: gold 1

adayfly的专栏 2415

PopWindow实现多级菜单显示

使用PopWindow实现多层菜单的显示,源代码当中给出了详细的注释适合新手参考

Android开发笔记(一百二十一)列表弹窗PopupMenu和ListPopupWindow

PopupMenu 基本用法 PopupMenu是种显示位置不固定的弹出菜单,因为它显示在参照控件下方,所以展示位置随着参照控件的位置变化而变化。而其他几种菜单的显示位置都是固定的,比如说选项菜单Options固定显示在屏幕下方,上下文菜单ContextMenu固定显示在屏幕中央,溢出菜单OverflowMenu固定显示在屏幕右上角,有关其他菜单的详细说明参见《Android开发笔记(六十五)

aqi00的博客 2万+

android 二级菜单、双ListView 仿美团、购物二级菜单

android 二级菜单、双ListView 仿美团、购物二级菜单

使用PopWindow构建二级菜单

使用PopWindowjiaFragMent实现两级菜单,大大减少了跳界面的问题

做一个Popupwindow二级菜单

如图样式,popupWindow外部不可点击 popupWindow的界面代码 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_pare...

weixin_43779101的博客 388

Android 多级PopupWindow的小demo.zip

Android 应用项目开发源码 参考和学习使用

Popupwindow的动画的设置

首先在anim 里面设置动画的,弹出和隐藏 弹出:首先扩展到1.1倍,然后返回原来的大小 <scale android:fromXScale="0.6" android:toXScale="1.1" android:fromYScale="0.6" android:toYScale="1.1"

Kodulf的专栏 1090

STM32F407驱动OV2640摄像头:从SCCB协议到I2C模拟的保姆级避坑指南

本文详细介绍了STM32F407驱动OV2640摄像头的完整流程,重点解析SCCB协议与I2C的关键差异,并提供GPIO模拟实现方案。通过实战案例和调试技巧,帮助开发者避开常见陷阱,实现稳定的图像采集功能。

weixin_28700411的博客 345

AI视频生成本地搭建图文详细过程

在自己的电脑上搭建一个AI,主要用于通过自己输入的关键字来自动生成视频文案,把视频文案自动生成视频,再自动给视频配音配字幕。

张小三的博客 4692

仿美团二级菜单

最近要做一个仿美团似的二级菜单 在csdn上找了demo 下载下来有错误不能运行 自己又整理了一下 终于可以运行实现效果了。布局xml就不贴出代码了,demo可以去csdn去下载:(后续补上链接) 1)分析思路,最外围的是一个Activity,顶部包含了一个View的容器,这个容器主要是装载ToggleButton来实现诸如美团里面的“美食,全城,理我最近,刷选”这一行。这一行一...

dazhuowei8522的博客 312

AD17入门简单教程(一)

AD17入门简单教程 我写这篇文章主要是因为最近刚学习完了AD17,想做一下总结,也希望通过自己心得的帮助一些刚入门AD17的小白。 总结一共分为两大部分,包括AD17的下载安装与汉化(文末有详细链接)、工程的创建、元器件库、PCB、走线中的常用命令介绍,文末还附有完整的PCB工程以及讲解视频。 第一部分工程的创建及元器件库常用命令 1.首先在桌面上创建一个文件夹,然后在AD17点击左上角的文件中...

qq_45433195的博客 2万+

Android中实现二级菜单

公司项目里的需求,商城的左下角,要求有分类的Menu。 看图: 1.当点击一级分类,修改二级菜单里面的内容。 2.同时一级菜单里的背景变为右边有白色三角的背景。 3.当点击二级菜单的条目时候,Popupwindow消失,并且界面更新对应条目的商品数据。 我的实现思路是:左下角弹出Popupwindow,里面使用两个ListView实现。 我的Demo的效果:

MayBe_MBack 6158

python基础·练习1(字符串作业)

python基础·练习1字符串作业一、填空二、编程初级中级 字符串作业 一、填空 1.已知s2 = ‘123’,则:s2 * 3 = ___________; s2 + str(456) = ___________; s2 = '123' print(s2 * 3) #123123123 print(s2 + str(456)) #123456 2.已知s1 = ‘123456789’。则: s1[:3] = ________; s1[-5:] =____________; s1[::2]=______;

qq_47326711的博客 8122

无需云服务器:飞牛云NAS+Docker搭建本地WordPress站点全球访问

在数字化浪潮中,网站搭建已成为个人和企业在推广自身品牌与业务的首要选择。飞牛云新推出的fnOS,这款集多功能于一身的nas系统,以其卓越的性能和灵活性,成为理想的本地网站部署平台。本文将带你一探如何在飞牛云NAS上通过Docker部署WordPress,并利用cpolar实现全球访问。

LT15171009269的博客 6528

[已解决] PopupWindow 弹出后点击屏幕任何地方都没有反应了,PopupWindow弹出之后,怎么点击外面取消不了

项目中用到PopupWindow,使用的时候发现PopupWindow 弹出后点击屏幕任何地方都没有反应了 一开始以为是设置设置touchable的问题,可是我都已经设置了,然后在网上也没有找到答案,后来想了一下我之前的demo 是可以为什么现在不行了呢, 后来比较项目中的代码和之前的demo PopupWindow的二级菜单的简单demo 发现原来是构造方法的问题,我在项目中使用了空的构造方

Kodulf的专栏 2274

Python 爬虫实战:爬取哔哩哔哩知识区,抓取高赞课程信息

哔哩哔哩(Bilibili)是一个广受欢迎的综合性视频社区,其中的知识区汇聚了大量优质的教育、科普、技术等课程内容。本文将指导读者如何使用 Python 爬虫技术从哔哩哔哩知识区抓取高赞课程信息,并进行数据分析。本文深入探究了利用 Python 爬虫技术从哔哩哔哩知识区抓取高赞课程信息的全流程。从前期的环境搭建、模拟登录,到核心的课程数据抓取、存储,再到后续的数据分析与可视化,都详细展开讲解并提供代码支持。通过此方法所获取的数据,能够助力创作者优化内容、用户发现优质课程、平台洞察用户需求。

u014481728的博客 1136

kotlin实现侧滑菜单,点击按钮出现二级菜单的效果

1.说明: 最近碰到一个需求,用kotlin实现,点击和左边侧滑,出现一个侧滑菜单,然后点击菜单的某一项。再出现一个可以选择的popupwindow,这种效果较为少见,被这个功能卡了一点时间,没有做到完全一模一样,差不多能用就行了,然后ui的话,大家如果需要的话,自己去写吧,那个样式,每个项目都是不同的,本demo有独立的xml文件,可以自定义样式 2.效果图: 最终样式效果图: de...

cf8833的博客 1147

Python全栈项目--手机语音远程控制智能家居系统(含嵌入式控制)

摘要:本项目实现了一个基于Python全栈的智能家居语音控制系统,支持手机端语音指令控制家居设备。系统采用FastAPI后端+Vue3前端的架构,集成Web Speech API实现语音识别,通过嵌入式设备(如ESP32)执行硬件控制。功能包括用户认证、设备管理、场景联动、指令解析和日志记录,支持HTTP轮询和直推两种命令下发模式。项目涵盖物联网全链路开发,适用于课程设计或毕业设计原型开发。

exlink2012的专栏 878

ANSYS WORKBENCH——参数化建模以及参数优化(结果导出为Excel)

目录 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 ​ 注:印记面的创建 5、模型属性设置 注:设置优化目标 6、回主界面,选择direct optimization模块 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 至此参数化建模就已经完成啦 注:印记面的创建 印记面一般是一个虚拟的区域,参与实际的网格划分,但是只是由于载.

python_AI_fans的博客 1万+

android tv二级菜单,android TV开发:弹出菜单实现

1.在有时候我们需要选择排序方式,在电视开发中往往使用一个弹出菜单实现,Demo效果: 2.核心代码:public class MainActivity extends Activity {private PopupWindow popupWindow;private View contentView;private Button btn;//...@Overrideprotected void ...

weixin_30072453的博客 605

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android 二级串联菜单的实现过程

在Android开发之中,经常会遇到二级的串联选择菜单,今天自己写了个Demo,实现了一下这种效果。

ddxxll2008的专栏 1440

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

实现二级Menu菜单

公司项目里的需求,商城的左下角,要求有分类的Menu。 看图: 1.当点击一级分类,修改二级菜单里面的内容。 2.同时一级菜单里的背景变为右边有白色三角的背景。 3.当点击二级菜单的条目时候,Popupwindow消失,并且界面更新对应条目的商品数据。 我的实现思路是:左下角弹出Popupwindow,里面使用两个ListView实现。 我的Demo的效果: 1,点...

QQ649233698的博客 843

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

android 下拉菜单实现,Android自定义控件:下拉菜单的实现与优化

下拉菜单美团首页类似的下拉弹出菜单工程中经常遇到的控件,不同工程中菜单条目的类型与数量也不一样所以需要根据实际需要填充不同内容。先写个demo,一倍不时之需吧。既然每个项目用到的菜单样式不同,此时我们必须根据实际情况填充,这样就需要将容器和内容分开。容器容器的画当然就使用popWindow了,我们需要在点击指定控件后弹出window,需要1.指定当前window的位置及大小2.指定window出方...

weixin_39901518的博客 653
上一篇: 简单的popupWindow的demo
下一篇: [已解决] Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()' on a n
千雅爸爸
博客等级 码龄18年 292粉丝 639原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值