这个内容内容涉及到的了两个知识点:

PopupWindow:使用PopupWindow创建一个简单的菜单

使用TabHost创建标签:这个网上好多教程随便看看就好。

实现思路:

观察一下UC浏览器的菜单我们可以发现,UC的菜单就是一个个标签页显示在了PopupWindow上,所以可以想到使用PopupWindow+TabHost来实现类似的效果。这样做,在标签页中我们可以使用android提供布局对象随意设置布局。

下面来看代码:

想要实现这种效果的菜单,默认的PopupWindow明显需要重写:

  1. public class MyMenu extends PopupWindow {
  2. private TabHost tabHost;    //标签页窗口
  3. private LayoutInflater inflater;     //用于加载tabhost
  4. private View layout;
  5. private Context context;
  6. //构造函数
  7. public MyMenu(Context context, int width, int height) {
  8. super(context);
  9. this.context = context;
  10. inflater = LayoutInflater.from(this.context);
  11. //创建标签页
  12. initTab();
  13. //设置默认选项
  14. setWidth(width);          //宽
  15. setHeight(height);        //高
  16. setContentView(tabHost);  //把标签页设置到PopupWindow上
  17. }
  18. //实例化标签页
  19. private void initTab(){
  20. layout =  inflater.inflate(R.layout.menu,null);
  21. tabHost = (TabHost)layout. findViewById(android.R.id.tabhost);       //获取tabhost
  22. tabHost.setBackgroundColor(Color.argb(60,144,144,150));              //设置背景色
  23. tabHost.setup();           //使用findViewById()加载tabhost时在调用addTab前必须调用
  24. /**
  25. * addTab()添加标签页
  26. *      tabHost.newTabSpec("Fitst")  创建一个tab
  27. *      setIndicator("A") 设置指针
  28. *      setContent(R.id.tab1)设置内容
  29. */
  30. tabHost.addTab(tabHost.newTabSpec("Fitst").setIndicator("A").setContent(R.id.tab1));
  31. tabHost.addTab(tabHost.newTabSpec("SECOND").setIndicator("B").setContent(R.id.tab2));
  32. tabHost.addTab(tabHost.newTabSpec("THIRD").setIndicator("C").setContent(R.id.tab3));
  33. tabHost.setCurrentTab(1);                                            //设置默认选种标签
  34. }
  35. //获取选项卡中的组件
  36. public  View getOption(int id){
  37. return layout.findViewById(id);
  38. }
  39. }

复制代码

菜单的布局文件res/layout/menu.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@android:id/tabhost"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <LinearLayout
  8. android:orientation="vertical"
  9. android:layout_height="fill_parent"
  10. android:layout_width="fill_parent">
  11. <TabWidget
  12. android:id="@android:id/tabs"
  13. android:layout_height="40dp"
  14. android:layout_width="fill_parent"
  15. />
  16. <FrameLayout
  17. android:id="@android:id/tabcontent"
  18. android:layout_width="fill_parent"
  19. android:layout_height="fill_parent">
  20. <LinearLayout
  21. android:layout_width="fill_parent"
  22. android:layout_height="fill_parent"
  23. android:id="@+id/tab1">
  24. <Button
  25. android:layout_height="wrap_content"
  26. android:layout_width="wrap_content"
  27. android:text="Tab   one"
  28. android:id="@+id/first_button"
  29. />
  30. </LinearLayout>
  31. <LinearLayout
  32. android:layout_width="fill_parent"
  33. android:layout_height="fill_parent"
  34. android:id="@+id/tab2">
  35. <TextView
  36. android:layout_height="wrap_content"
  37. android:layout_width="wrap_content"
  38. android:text="Tab   two"
  39. />
  40. </LinearLayout>
  41. <LinearLayout
  42. android:layout_width="fill_parent"
  43. android:layout_height="fill_parent"
  44. android:id="@+id/tab3">
  45. <TextView
  46. android:layout_height="wrap_content"
  47. android:layout_width="wrap_content"
  48. android:text="Tab   three"目前菜单的样子还是比较丑陋了,美化大家自己发挥好了!/>
  49. </LinearLayout>
  50. </FrameLayout>
  51. </LinearLayout>
  52. </TabHost>

在Activity中使用:

  1. public class MyActivity extends Activity
  2. {
  3. private MyMenu menu;
  4. private LinearLayout linear;
  5. @Override
  6. public void onCreate(Bundle savedInstanceState)
  7. {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.main);
  10. init();
  11. }
  12. //组件初始化
  13. private void init(){
  14. linear = (LinearLayout) findViewById(R.id.popMenu);
  15. int width = getWindowManager().getDefaultDisplay().getWidth()-15;      //菜单的宽度
  16. int heigth = getWindowManager().getDefaultDisplay().getHeight()/3;     //菜单的高度
  17. menu = new MyMenu(this, width,heigth);
  18. Button button= (Button) menu.getOption(R.id.first_button); //获取菜单第一个标签页中的按钮
  19. //添加点击事件
  20. button.setOnClickListener(new Button.OnClickListener(){
  21. public void onClick(View v) {
  22. Toast.makeText(MyActivity.this,"tab one",Toast.LENGTH_SHORT).show();
  23. }
  24. });
  25. }
  26. //显示菜单
  27. private void show(){
  28. menu.showAtLocation(linear, Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL,0,0);
  29. }
  30. @Override
  31. public boolean onKeyDown(int keyCode, KeyEvent event) {
  32. //按以下菜单按键展示菜单 按两下隐藏菜单
  33. if(!menu.isShowing()&&keyCode == KeyEvent.KEYCODE_MENU){
  34. show();
  35. }
  36. else{
  37. menu.dismiss();
  38. }
  39. return true;
  40. }
  41. }

Android开发之模仿UC浏览器的菜单的更多相关文章

  1. 前端开发在手机UC浏览器上遇到的坑

    1.user-scalable问题 写手机页面都会加一个meta标签 <meta content="width=device-width, initial-scale=1.0, max ...

  2. Android开发工程师文集-提示框,菜单,数据存储,组件篇

    提示框,菜单,数据存储,组件篇 Toast Toast.makeText(context, text, 时间).show(); setDuration();//设置时间 setGravity();// ...

  3. Android开发学习之3大类菜单

    在Android系统中,菜单可以分为三类:选项菜单(Option Menu),上下文菜单(Context Menu)以及子菜单(Sub Menu). 一.选项菜单(Option Menu) 创建选项菜 ...

  4. Android 开发一定要看的15个实战项目

    前言: 虽说网上有太多的Android课程,但是大多都是视频,有Android在线开发环境的几乎没有,但是对于学习Android的人来说拥有在线的Android开发环境是非常好的,可以随时动手操作学习 ...

  5. UC浏览器插件开发

    pip install UC浏览器插件是个什么玩意? 如图所看到的,便是UC的插件面板. UC通过开放浏览器插件api, 使开发人员可以进行插件的开发. 插件种类: 1 : extension. 就是 ...

  6. UC浏览器调试移动端网站

    准备工作: UC浏览器开发版网址 UC浏览器开发者版下载地址 下载adb_tool 步骤: 1.将adb_tool解压,把里面的文件复制到 C:\Windows\SysWOW64 文件夹下面. 2.运 ...

  7. 站在巨人的肩膀上学习Android开发

    我们知道,一開始最好的学习方法是模仿,尤其是模仿巨人. 那说到Android开发的模仿自然就是分析并研究主流程序的布局.实现方法.进而提升自己的技术. 第一招----逆向project 要分析&quo ...

  8. Android 高仿UC浏览器监控剪切板弹出悬浮窗功能

    UC浏览器应该是android手机里 最流行的浏览器之一了,他们有一个功能 相信大家都体验过,就是如果你复制了什么文字,(在其他app中 复制也有这个效果!,所以能猜到肯定是监控了剪切板),就会弹出一 ...

  9. android仿微信红包动画、Kotlin综合应用、Xposed模块、炫酷下拉视觉、UC浏览器滑动动画等源码

    Android精选源码 仿微信打开红包旋转动画 使用Kotlin编写的Android应用,内容你想象不到 Android手机上的免Root Android系统日志Viewer 一个能让微信 Mater ...

随机推荐

  1. 附 5 springboot之配置文件

    本文转载自http://www.jianshu.com/p/80621291373b,作者:龙白一梦 我的boss 代码从开发到测试要经过各种环境,开发环境,测试环境,demo环境,线上环境,各种环境 ...

  2. 基础学习:C#中float的取值范围和精度

    float类型的表现形式: 默认情况下,赋值运算符右侧的实数被视为 double. 因此,应使用后缀 f 或 F 初始化浮点型变量,如以下示例中所示: float x = 3.5F; 如果在以上声明中 ...

  3. Diablo 3 Web API

    这是暴雪提供的WebAPI,能够通过网页的方式訪问玩家的用户信息.结构相当清晰,非常有借鉴价值. 应用JSON(JavaScript Object Notation)做数据交换,很好理解. 以我的暗黑 ...

  4. OpenNMS编译,打包并在Windows下启动

    1.Download Opennms latest source code 2.Download latest Java JDK and install it. Set JAVA_HOME path ...

  5. 火狐浏览器Firefox不支持alt怎么

    因为HTML代码的解析不同,需要把标签文字"alt"换成"title",就可以在FireFox中正常显示了. 如下所示,IE对于alt和title均可以支持 但 ...

  6. JavaScript 之 对象和数组

    一:对象   说起对象,我们不自然就想起了面向对象中自封装的一个类,同样JS中也是遵循这个守则,在web编程中几乎天天用到的就是JSON.是的,这就是一个对象,不过这个对象下面的字段都是字符串和值类型 ...

  7. Sql_Handle and Plan_Handle Explained

    For batches, the SQL handles are hash values based on the SQL text. For database objects such as sto ...

  8. TP自动生成模块目录

    TP自动生成模块目录 例如我想在项目中增加一个AdminI模块 只需要在入口文件index.php中添加: define('BIND_MODULE','Admin'); 再访问127.0.0.1项目就 ...

  9. 转义字符 HTML 字符实体 < >: &等

    在 HTML 中,某些字符是预留的. 在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签. 如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用 ...

  10. hdu5246 超级赛亚ACMer

    Problem Description 百小度是一个ACMer,也是一个超级赛亚人,每一个ACMer都有一个战斗力.包含百小度.
所谓超级赛亚人的定义,是说假设在对抗中刚好接近极限状态,那就会激发斗志 ...