Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 485|回复: 0

开发交流:Android 提高之自定义Menu(TabMenu)

[复制链接]

该用户从未签到

发表于 2011-10-24 10:10:56 | 显示全部楼层 |阅读模式
用过UCWEB-Android版的人都应该对其特殊的menu有印象,把menu做成Tab-Menu(支持分页的Menu),可以容纳比Android传统的menu更丰富的内容(Android的menu超过6项则缩略在[更多]里),本文参考网上的例子(作者:CoffeeCole,email:longkefan@foxmail.com) ,对例子进行简化以及封装,使其作为一个复合控件融入自己的framework。
  
  TabMenu 本身就是一个PopupWindow,PopupWindow上面放了两个GridView,第一个GridView就是分页标签,位于 PopupWindow的顶部,第二个GridView是菜单,位于PopupWindow的主体。为了实现PopupWindow的弹出/退出的动画效果,本文使用了以下代码:

       在工程的res文件夹里添加anim子目录,再新建文件popup_enter.xml:

java代码: < ? xml version = "1.0" encoding = "utf-8" ?>

< set xmlns:android = "http://schemas.android.com/apk/res/android" >

< translate android:fromYDelta = "100%p" android:toYDelta = "0" android:duration = "1000" />

< alpha android:fromAlpha = "0.0" android:toAlpha = "1.0" android:duration = "1000" />

< / set >
复制代码在工程的values文件夹里新建文件popup_animation.xml:

Java代码:

< ?xml version="1.0" encoding="utf-8"?>

< resources>

< style name=&quotopupAnimation" parent="android:Animation">

< item name="android:windowEnterAnimation">@anim/popup_enter< /item>

< item name="android:windowExitAnimation">@anim/popup_exit< /item>

< /style>

< /resources>
复制代码main.xml的源码如下:

Java代码:

< ? xml version = "1.0" encoding = "utf-8" ?>

< LinearLayout

android:id = "@+id/LinearLayout01"

android:layout_width = "fill_parent"

android:layout_height = "fill_parent"

xmlns:android = "http://schemas.android.com/apk/res/android" >

< TextView

android:id = "@+id/TextView01"

android:layout_height = "wrap_content"

android:layout_width = "fill_parent"

android:text = "扩展Menu----hellogv" >

< / TextView >

< / LinearLayout >
复制代码TabMenu的封装类TabMenu.java的源码如下:

Java代码:

package eoe.testTabMenu;



import android.content.Context;

import android.graphics.Color;

import android.graphics.drawable.ColorDrawable;

import android.view.Gravity;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.GridView;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.PopupWindow;

import android.widget.TextView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.LinearLayout.LayoutParams;



public class TabMenu extends PopupWindow{

private GridView gvBody, gvTitle;

private LinearLayout mLayout;

private MenuTitleAdapter titleAdapter;

public TabMenu(Context context,OnItemClickListener titleClick,OnItemClickListener bodyClick,

MenuTitleAdapter titleAdapter,int colorBgTabMenu, int aniTabMenu){

super (context);

mLayout = new LinearLayout(context);

mLayout.setOrientation(LinearLayout.VERTICAL);

//标题选项栏

gvTitle = new GridView(context);

gvTitle.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));





gvTitle.setNumColumns(titleAdapter.getCount());

gvTitle.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);





gvTitle.setVerticalSpacing(1 );

gvTitle.setHorizontalSpacing(1 );

gvTitle.setGravity(Gravity.CENTER);

gvTitle.setOnItemClickListener(titleClick);

gvTitle.setAdapter(titleAdapter);

gvTitle.setSelector(new ColorDrawable(Color.TRANSPARENT)); //选中的时候为透明色

this .titleAdapter=titleAdapter;

//子选项栏

gvBody = new GridView(context);

gvBody.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));

gvBody.setSelector(new ColorDrawable(Color.TRANSPARENT)); //选中的时候为透明色

gvBody.setNumColumns(4 );

gvBody.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);

gvBody.setVerticalSpacing(10 );

gvBody.setHorizontalSpacing(10 );

gvBody.setPadding(10 , 10 , 10 , 10 );

gvBody.setGravity(Gravity.CENTER);

gvBody.setOnItemClickListener(bodyClick);

mLayout.addView(gvTitle);

mLayout.addView(gvBody);





//设置默认项

this .setContentView(mLayout);

this .setWidth(LayoutParams.FILL_PARENT);

this .setHeight(LayoutParams.WRAP_CONTENT);

this .setBackgroundDrawable( new ColorDrawable(colorBgTabMenu)); // 设置TabMenu菜单背景

this .setAnimationStyle(aniTabMenu);

this .setFocusable( true ); // menu菜单获得焦点 如果没有获得焦点menu菜单中的控件事件无法响应

}



public void SetTitleSelect( int index){

gvTitle.setSelection(index);

this .titleAdapter.SetFocus(index);

}



public void SetBodySelect( int index, int colorSelBody){

int count=gvBody.getChildCount();

for ( int i= 0 ;i< count;i++){

if (i!=index)

((LinearLayout)gvBody.getChildAt(i)).setBackgroundColor(Color.TRANSPARENT);

}



((LinearLayout)gvBody.getChildAt(index)).setBackgroundColor(colorSelBody);

}



public void SetBodyAdapter(MenuBodyAdapter bodyAdapter){



gvBody.setAdapter(bodyAdapter);

}
复制代码


Android 提高之自定义Menu(TabMenu)2
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 02:43 , Processed in 0.359144 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表