- 浏览: 500966 次
- 性别:
- 来自: 福州
文章分类
- 全部博客 (165)
- iphone (2)
- android (13)
- 设计模式 (8)
- ND实习小记之Android (63)
- mac使用技巧 (1)
- window phone (1)
- 错误总结 (2)
- 开发记录 (6)
- Android控件常用属性 (7)
- 代码管理工具 (5)
- 黑莓开发 (2)
- Eclipse (9)
- Android实践项目 (6)
- 常用布局 (1)
- 自定义Widget (5)
- adapter (2)
- OsChina Android客户端研究 (1)
- android之我见 (4)
- Java相关 (1)
- 存储 (1)
- 调试 (1)
- NDK相关 (2)
- App Components (7)
- Android_提醒 (2)
- Android_存储 (0)
- Android_线程 (3)
- Android控件使用实例 (5)
- 键盘相关 (1)
- android之我见,源码 (1)
最新评论
-
xy_feng_zhi_chao:
多谢楼主分享
Android中使用styles -
michaelye1988:
soldier93 写道无关素质,我只发表自己的看法!既然你发 ...
如何在window上把你的项目提交到github -
soldier93:
无关素质,我只发表自己的看法!既然你发表了博客我就有权对其评价 ...
如何在window上把你的项目提交到github -
michaelye1988:
soldier93 写道laji 素质真低
如何在window上把你的项目提交到github -
soldier93:
laji
如何在window上把你的项目提交到github
这里要介绍一下制作九宫格菜单的两种方法:
第一种就是直接使用布局文件。在ScrollView中嵌套Button即可,这种做法适用于按钮位置不变,功能固定的情况。
第二种使用的是GridView,通过设置数据源来动态生成布局,这种做法灵活性比较大,适用于功能不固定的情况,比如用户的权限不够的时候,设置某些按钮不可见等。
我将这两种做法整理到一个Demo中。下面是效果图:
下面先介绍第一种做法 (使用布局文件)的主要代码:
布局文件activity_common.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/bg_register" > <!-- Title --> <RelativeLayout android:id="@+id/rl_title" android:layout_width="fill_parent" android:layout_height="45dip" android:layout_alignParentTop="true" android:background="@drawable/bg_title_bar" android:gravity="center_vertical" > <Button android:id="@+id/btn_back" android:layout_width="70dip" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_marginLeft="8dip" android:background="@drawable/title_btn_back_selector" android:text="@string/back" android:textColor="@color/title_button_color_gray" /> </RelativeLayout> <!-- Ads --> <TextView android:id="@+id/tv_add" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@drawable/add_icon" /> <!-- Five Direction Pad Buttons --> <ScrollView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/tv_add" android:layout_below="@+id/rl_title" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/btn_workbench" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="5dip" android:layout_weight="1" android:background="@drawable/main_icon_bg_selector" android:drawableTop="@drawable/main_icon_workbench" android:paddingTop="5dip" android:text="@string/main_btn_workbench" android:textColor="@color/main_button_color" /> <Button android:id="@+id/btn_company" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="5dip" android:layout_weight="1" android:background="@drawable/main_icon_bg_selector" android:drawableTop="@drawable/main_icon_company" android:paddingTop="5dip" android:text="@string/main_btn_company" android:textColor="@color/main_button_color" /> <Button android:id="@+id/btn_zxl" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="5dip" android:layout_weight="1" android:background="@drawable/main_icon_bg_selector" android:drawableTop="@drawable/main_icon_zxl" android:paddingTop="5dip" android:text="@string/main_btn_zxl" android:textColor="@color/main_button_color" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/btn_manage" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="5dip" android:layout_weight="1" android:background="@drawable/main_icon_bg_selector" android:drawableTop="@drawable/main_icon_manage" android:paddingTop="5dip" android:text="@string/main_btn_manage" android:textColor="@color/main_button_color" /> <Button android:id="@+id/btn_record" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="5dip" android:layout_weight="1" android:background="@drawable/main_icon_bg_selector" android:drawableTop="@drawable/main_icon_record" android:paddingTop="5dip" android:text="@string/main_btn_record" android:textColor="@color/main_button_color" /> <Button android:id="@+id/btn_addlist" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="5dip" android:layout_weight="1" android:background="@drawable/main_icon_bg_selector" android:drawableTop="@drawable/main_icon_addlist" android:paddingTop="5dip" android:text="@string/main_btn_addlist" android:textColor="@color/main_button_color" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/btn_placard" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="5dip" android:layout_weight="1" android:background="@drawable/main_icon_bg_selector" android:drawableTop="@drawable/main_icon_placard" android:paddingTop="5dip" android:text="@string/main_btn_placard" android:textColor="@color/main_button_color" /> <Button android:id="@+id/btn_my_record" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="5dip" android:layout_weight="1" android:background="@drawable/main_icon_bg_selector" android:drawableTop="@drawable/main_icon_myrecord" android:paddingTop="5dip" android:text="@string/main_btn_myrecord" android:textColor="@color/main_button_color" /> <Button android:id="@+id/btn_set" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="5dip" android:layout_weight="1" android:background="@drawable/main_icon_bg_selector" android:drawableTop="@drawable/main_icon_set" android:paddingTop="5dip" android:text="@string/main_btn_set" android:textColor="@color/main_button_color" /> </LinearLayout> </LinearLayout> </ScrollView> </RelativeLayout>
CommonActivity.java
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; /** * This Five Direction Pad is made by the widget of ScrollView and Button * * 这种做法使用的是ScrollView嵌套Button来实现九宫格,相对于GridView的做法,灵活性较差 * * @author MichaelYe * @since 2012-9-4 * */ public class CommonActivity extends Activity { private ViewHolder viewHolder; class ViewHolder { private Button btnBack; private Button btnWorkbanch; private Button btnCompany; private Button btnZXL; private Button btnmanage; private Button btnArchive; private Button btnAddBook; private Button btnPlacard; private Button btnMyArchive; private Button btnSet; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.common_activity); viewHolder = new ViewHolder(); iniComponent(); } private void iniComponent() { viewHolder.btnBack = (Button)findViewById(R.id.btn_back); viewHolder.btnWorkbanch = (Button)findViewById(R.id.btn_workbench); viewHolder.btnCompany = (Button)findViewById(R.id.btn_company); viewHolder.btnZXL = (Button)findViewById(R.id.btn_zxl); viewHolder.btnmanage = (Button)findViewById(R.id.btn_manage); viewHolder.btnArchive = (Button)findViewById(R.id.btn_record); viewHolder.btnAddBook = (Button)findViewById(R.id.btn_addlist); viewHolder.btnPlacard = (Button)findViewById(R.id.btn_placard); viewHolder.btnMyArchive = (Button)findViewById(R.id.btn_my_record); viewHolder.btnSet = (Button)findViewById(R.id.btn_set); viewHolder.btnBack.setOnClickListener(clickListener); viewHolder.btnWorkbanch.setOnClickListener(clickListener); viewHolder.btnCompany.setOnClickListener(clickListener); viewHolder.btnZXL.setOnClickListener(clickListener); viewHolder.btnmanage.setOnClickListener(clickListener); viewHolder.btnArchive.setOnClickListener(clickListener); viewHolder.btnAddBook.setOnClickListener(clickListener); viewHolder.btnPlacard.setOnClickListener(clickListener); viewHolder.btnMyArchive.setOnClickListener(clickListener); viewHolder.btnSet.setOnClickListener(clickListener); } private View.OnClickListener clickListener = new View.OnClickListener() { public void onClick(View v) { switch (v.getId()) { case R.id.btn_back: finish(); break; case R.id.btn_workbench: break; case R.id.btn_company: break; case R.id.btn_zxl: break; case R.id.btn_manage: break; case R.id.btn_record: break; case R.id.btn_addlist: break; case R.id.btn_placard: break; case R.id.btn_my_record: break; case R.id.btn_set: break; } } }; }
第二种做法
使用GridView的做法:
布局文件:
activity_main:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/bg_register" > <RelativeLayout android:id="@+id/rl_title" android:layout_width="fill_parent" android:layout_height="45dip" android:layout_alignParentTop="true" android:background="@drawable/bg_title_bar" android:gravity="center_vertical" > <Button android:id="@+id/btn_logout" android:layout_width="70dip" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginRight="8dip" android:background="@drawable/title_btn_rect_selector" android:text="@string/more" android:textColor="@color/title_button_color_gray" /> </RelativeLayout> <TextView android:id="@+id/tv_add" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@drawable/add_icon" /> <GridView android:id="@+id/gv_gridview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_above="@+id/tv_add" android:layout_below="@+id/rl_title" android:focusable="false" android:numColumns="3" /> </RelativeLayout>
MainActivity.java
import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.GridView; import android.widget.TextView; /** * This Five Direction Pad is made by the widget of GridView and Button * * 这个就宫格菜单采用的是GridView和Button来实现的 * * @author MichaelYe * @since 2012-9-4 * */ public class MainActivity extends Activity { private ViewHolder viewHolder; private final static String STR_WORKBANCH = "工作台"; private final static String STR_COMPANY = "公司概况"; private final static String STR_ZHIXINLI = "执行力"; private final static String STR_MANAGE = "人才管理"; private final static String STR_ARCHIVE = "员工档案"; private final static String STR_ADDRESS_BOOK = "通讯录"; private final static String STR_PLACARD = "公告"; private final static String STR_MY_ARCHIVE = "我的档案"; private final static String STR_SET = "设置"; class ViewHolder { private Button btnLogout; private TextView tvAdd; private GridView gvGridView; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewHolder = new ViewHolder(); iniComponent(); viewHolder.gvGridView.setSelector(R.drawable.main_icon_bg_selector);//设置GridView自身的Item点击效果 viewHolder.gvGridView.setAdapter(new GridViewAdapter(stringList)); viewHolder.gvGridView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.e("++++++++++++++++:", ""+position); } }); } private List<String> stringList; private void iniComponent() { viewHolder.btnLogout = (Button)findViewById(R.id.btn_logout); viewHolder.tvAdd = (TextView)findViewById(R.id.tv_add); viewHolder.gvGridView = (GridView)findViewById(R.id.gv_gridview); viewHolder.btnLogout.setOnClickListener(clickListener); viewHolder.tvAdd.setOnClickListener(clickListener); stringList = new ArrayList<String>(); stringList.add("工作台"); stringList.add("公司概况"); stringList.add("执行力"); stringList.add("人才管理"); stringList.add("员工档案"); stringList.add("通讯录"); stringList.add("公告"); stringList.add("我的档案"); stringList.add("设置"); } private class GridViewAdapter extends BaseAdapter { List<String> stringList; int textColor; Drawable iconBg; public GridViewAdapter(List<String> stringList) { this.stringList = stringList; textColor = MainActivity.this.getResources().getColor(R.color.main_button_color);//文字颜色 iconBg = MainActivity.this.getResources().getDrawable(R.drawable.main_icon_bg_normal);//透明背景 } public int getCount() { return this.stringList.size(); } public Object getItem(int position) { return null; } public long getItemId(int position) { return position; } class ViewHolder { private Button btn; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if(convertView == null) { //另外一种通过布局文件加载Item的做法 // LayoutInflater myInflater = LayoutInflater.from(Act_Main.this); // convertView = myInflater.inflate(R.layout.gridview_item, null); // viewHolder = new ViewHolder(); // viewHolder.btn = (Button)convertView.findViewById(R.id.button); // convertView.setTag(viewHolder); viewHolder = new ViewHolder(); viewHolder.btn = new Button(MainActivity.this); viewHolder.btn.setClickable(false); viewHolder.btn.setFocusable(false); convertView = viewHolder.btn; convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder)convertView.getTag(); } String str = this.stringList.get(position); if(str.equals(STR_WORKBANCH)) { viewHolder.btn.setCompoundDrawablesWithIntrinsicBounds(null,MainActivity.this.getResources().getDrawable(R.drawable.main_icon_workbench),null,null); viewHolder.btn.setBackgroundDrawable(iconBg); viewHolder.btn.setTextColor(textColor); viewHolder.btn.setText(STR_WORKBANCH); } if(str.equals(STR_COMPANY)) { viewHolder.btn.setCompoundDrawablesWithIntrinsicBounds(null,MainActivity.this.getResources().getDrawable(R.drawable.main_icon_company),null,null); viewHolder.btn.setBackgroundDrawable(iconBg); viewHolder.btn.setTextColor(textColor); viewHolder.btn.setText(STR_COMPANY); } if(str.equals(STR_ZHIXINLI)) { viewHolder.btn.setCompoundDrawablesWithIntrinsicBounds(null,MainActivity.this.getResources().getDrawable(R.drawable.main_icon_zxl),null,null); viewHolder.btn.setBackgroundDrawable(iconBg); viewHolder.btn.setTextColor(textColor); viewHolder.btn.setText(STR_ZHIXINLI); } if(str.equals(STR_MANAGE)) { viewHolder.btn.setCompoundDrawablesWithIntrinsicBounds(null,MainActivity.this.getResources().getDrawable(R.drawable.main_icon_manage),null,null); viewHolder.btn.setBackgroundDrawable(iconBg); viewHolder.btn.setTextColor(textColor); viewHolder.btn.setText(STR_MANAGE); } if(str.equals(STR_ARCHIVE)) { viewHolder.btn.setCompoundDrawablesWithIntrinsicBounds(null,MainActivity.this.getResources().getDrawable(R.drawable.main_icon_record),null,null); viewHolder.btn.setBackgroundDrawable(iconBg); viewHolder.btn.setTextColor(textColor); viewHolder.btn.setText(STR_ARCHIVE); } if(str.equals(STR_ADDRESS_BOOK)) { viewHolder.btn.setCompoundDrawablesWithIntrinsicBounds(null,MainActivity.this.getResources().getDrawable(R.drawable.main_icon_addlist),null,null); viewHolder.btn.setBackgroundDrawable(iconBg); viewHolder.btn.setTextColor(textColor); viewHolder.btn.setText(STR_ADDRESS_BOOK); } if(str.equals(STR_PLACARD)) { viewHolder.btn.setCompoundDrawablesWithIntrinsicBounds(null,MainActivity.this.getResources().getDrawable(R.drawable.main_icon_placard),null,null); viewHolder.btn.setBackgroundDrawable(iconBg); viewHolder.btn.setTextColor(textColor); viewHolder.btn.setText(STR_PLACARD); } if(str.equals(STR_MY_ARCHIVE)) { viewHolder.btn.setCompoundDrawablesWithIntrinsicBounds(null,MainActivity.this.getResources().getDrawable(R.drawable.main_icon_myrecord),null,null); viewHolder.btn.setBackgroundDrawable(iconBg); viewHolder.btn.setTextColor(textColor); viewHolder.btn.setText(STR_MY_ARCHIVE); } if(str.equals(STR_SET)) { viewHolder.btn.setCompoundDrawablesWithIntrinsicBounds(null,MainActivity.this.getResources().getDrawable(R.drawable.main_icon_set),null,null); viewHolder.btn.setBackgroundDrawable(iconBg); viewHolder.btn.setTextColor(textColor); viewHolder.btn.setText(STR_SET); // viewHolder.btn.setOnClickListener(new OnClickListener() { // // public void onClick(View v) { // // TODO Auto-generated method stub // Log.e("111111111111111", ""); // } // }); } return convertView; } }; private View.OnClickListener clickListener = new View.OnClickListener() { public void onClick(View v) { switch (v.getId()) { case R.id.btn_logout: Intent intent = new Intent(); intent.setClass(MainActivity.this, CommonActivity.class); startActivity(intent); break; case R.id.tv_add: break; } } }; }
具体使用哪种可以根据情况而定。
项目下载地址:
https://github.com/michaelye/DemoGridView
评论
1 楼
liuweihug
2014-04-29
这里有个js版的。jquery弹出九宫格菜单--适应复杂界面
http://www.suchso.com/projecteactual/jquery-pop-nine-gongge-menu.html
http://www.suchso.com/projecteactual/jquery-pop-nine-gongge-menu.html
相关推荐
九宫格布局的关键在于如何实现跨浏览器的兼容性和适应不同屏幕尺寸的响应式设计。在HTML5中,我们通常会利用新的标签如`<section>`、`<article>`和`<div>`来结构化页面,并结合CSS3的Flexbox或Grid布局来创建灵活的...
本示例的焦点在于“代码写布局-九宫格”,这是一个常见的设计模式,尤其适用于显示图片,如微信朋友圈中的照片展示。在这里,我们将深入探讨如何通过代码实现这样一个九宫格布局。 首先,我们需要理解九宫格布局的...
标题中的"J2ME界面用的九宫格菜单"指的是在J2ME环境中实现的一种用户界面设计,它采用九个单元格组成的网格布局,为用户提供直观、简洁的操作方式,常用于展示多个功能选项或快捷方式,类似如今手机上的应用抽屉。...
本教程将详细讲解如何通过自定义ViewGroup来实现一个功能丰富的九宫格图片布局,支持图片的编辑、删除和添加。 首先,我们需要创建一个新的Java类,继承自`ViewGroup`。这个类将作为九宫格的基础容器,我们称之为`...
本篇文章将详细讲解如何利用jQuery实现一个九宫格布局,并在点击时弹出菜单的特效。 一、jQuery九宫格布局 九宫格布局是一种常见的网页设计模式,它将内容均匀地分布在一个3x3的网格中。在HTML中,我们可以创建一个...
创建九宫格菜单的核心在于利用CSS布局技术,如网格系统、Flexbox或Grid布局。以下是一些关键知识点: 1. **CSS Grid布局**:CSS Grid是最适合构建九宫格布局的方法之一。通过定义`display: grid`和`grid-template-...
HTML5九宫格布局的网格菜单效果是一种现代网页设计中常见的交互式元素,它结合了HTML5的新特性、CSS3的样式以及JavaScript的动态效果,为用户提供了丰富的视觉体验和友好的交互操作。这种布局模式通常用于展示产品、...
在Java ME(J2ME)平台上,开发人员经常需要创建用户友好的界面,其中九宫格菜单是一个常见的设计模式。这种菜单布局将多个功能项排列成3x3的矩阵,提供直观的操作方式。本篇文章将深入探讨如何在J2ME环境中实现一个...
本示例中的“iOS swift写的九宫格菜单demo”是一个基于Swift实现的交互式菜单控件,旨在帮助开发者轻松创建具有自定义功能的九宫格布局。下面将详细解析这个demo所涉及的知识点: 1. **Swift语言基础**:了解Swift...
在Android开发中,GridView是一种非常常用的布局控件,它能够以网格的形式展示数据,非常适合用来实现九宫格菜单。九宫格菜单通常用于应用程序的主界面,显示一系列图标和文字,用户点击图标即可进入相应的功能模块...
在Android开发中,九宫格布局是一种常见的UI设计模式,常用于应用的启动页、设置菜单或者快捷方式等场景。这种布局将九个元素排列成3行3列,每个元素大小相同,间距相等,提供了良好的用户体验。在这个“android九宫...
第一个版本是九宫格布局的版本。 将IGCusShareView文件添加到你的工程即可使用。 使用方式: IGCusShareView *view = [[IGCusShareView alloc] initWithFrame:self.view.bounds]; [view showFromControlle:self]; ...
【标题】"九宫格前端大屏,html和js部分,自适应"涉及的主要知识点是构建一个基于HTML和JavaScript的响应式九宫格布局,适用于大屏幕展示。在这个项目中,开发者利用这两种核心技术来实现一个在不同设备尺寸上都能...
这个组件将管理九宫格的整体布局,并根据提供的数据生成多个`SquareComponent`实例。这可以通过在`ngOnInit`生命周期钩子中动态创建组件来实现,或者使用`*ngFor`指令循环渲染`SquareComponent`: ```typescript ...
九宫格布局通常用于展示一系列图标或功能,使得用户可以快速浏览和选择,比如应用启动页的快捷方式、设置菜单、或者图片库等。这种布局将屏幕分为9个相等大小的单元格,每个单元格可以承载一个图标或者操作项。 ...
使用uniapp 实现图片九宫格、完美动态适配手机各种尺寸、已抽离成组件 只需修改单个字段 实现页面布局、 class="pic-container" :style="{ paddingLeft: spacingNumber + 'px', paddingRight: ...
它允许开发者在顶部导航栏或者任何其他视图上添加一个可下拉的九宫格菜单。这个菜单在未展开时占用较小的空间,点击后会以动画形式向下展开,展示九个选项。每个选项通常包含文字和图标,使得用户能快速识别并选择所...
**J2ME 通用九宫格菜单** 在Java 2 Micro Edition (J2ME) 平台上,开发人员经常需要创建具有用户友好界面的应用程序。其中,九宫格菜单是一种常见的设计模式,它能有效地展示多个功能选项,使得用户能够轻松地通过...
"九宫格"是一种常见的布局方式,尤其在展示图标、菜单或选择项时非常实用。在这个项目中,我们将深入探讨如何实现iOS的九宫格布局。 首先,我们需要了解iOS中的几种布局技术。UIKit提供了Auto Layout和Size Classes...
【标题】"九宫格素材"所指的是一种常见的网页设计布局方式,它将一个页面分割成九个相等大小的方格,常用于展示图片、卡片式信息或者导航菜单等。这种布局简洁且富有视觉吸引力,使得内容的排列更加有序,同时也便于...