Android工具导航栏
来源:互联网 发布:二分搜索算法,c语言 编辑:程序博客网 时间:2024/06/06 17:11
今天继续Android学习之旅之导航栏的记录。本文采用了两种方式实现:1.用ActivityGroup和DataGrid相结合实现;2.采用继承FragmentActivity和RadioButton相组合实现;
先定义了一个图片适配器类(也可以直接用SimpleAdapter 类),继承自BaseAdapter:
至此框架完成,其他要注意的细节:这边在选中时添加了个背景图片以便醒目;各个页面的图片显示问题,我这边采用了跟手机一样像素的图片才正好铺满屏幕,开始弄的图片像素太低,就只在屏幕的左上边显示;图标和最好采用无背景的图片(相对背景为白色的,透明更美观);只要涉及到多页面就要记得在AndroidManifest.xml中配置进去;
运行截图如下:
项目运行截图跟上例类似:
1.用ActivityGroup和DataGrid相结合实现
首先是用ActivityGroup和DataGrid相结合实现,思想是在一个页面上将子页面与导航栏上下布局,每次点击时跳转到指定的页面,在上面显示。主页面的布局activity_main.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/content" android:layout_width="fill_parent" android:layout_height="match_parent" android:orientation="vertical" > </LinearLayout> <GridView android:id="@+id/gridView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:fadingEdge="vertical" android:fadingEdgeLength="5px" > </GridView> </RelativeLayout></LinearLayout>
content中显示需要跳转的页面,gridView专门显示导航栏。
此例中四个要跳转的页面都很简单,只是显示一张图片,布局都一样,所以共用一个布局文件(实际应用时一般都是各不相同,第二个例子就是各自用各自的布局文件),布局文件view_layout.xml代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ImageView android:id="@+id/imageView_Back" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="fitXY"/></LinearLayout>下面要做的就剩两步了,一是加载gridView,一个是触发点击事件跳转页面。加载gridView的方法如下(不熟悉没关系,可以参考Android之GridView):
先定义了一个图片适配器类(也可以直接用SimpleAdapter 类),继承自BaseAdapter:
package com.example.activitygroup0817;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.GridView;import android.widget.ImageView;public class ImageAdapter extends BaseAdapter {private Context context = null;private ImageView[] menuImg = null;private int selectedMenuImg;public ImageAdapter(Context context, int imgIds[], int width, int height,int selectedMenuImg) {this.context = context;this.selectedMenuImg = selectedMenuImg;this.menuImg = new ImageView[imgIds.length];for (int i = 0; i < imgIds.length; i++) {this.menuImg[i] = new ImageView(this.context);//定义布局参数this.menuImg[i].setLayoutParams(new GridView.LayoutParams(width,height));//不调整边界this.menuImg[i].setAdjustViewBounds(false);this.menuImg[i].setPadding(3, 3, 3, 3);this.menuImg[i].setImageResource(imgIds[i]);}}@Overridepublic int getCount() {return this.menuImg.length;}@Overridepublic Object getItem(int position) {return this.menuImg[position];}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ImageView imgView = null;if (convertView == null) {imgView = this.menuImg[position];} else {imgView = (ImageView) convertView;}return imgView;}public void setFocus(int selId) {for (int i = 0; i < this.menuImg.length; i++) {if (i != selId) {//取消背景图片this.menuImg[i].setBackgroundResource(0);}}this.menuImg[selId].setBackgroundResource(this.selectedMenuImg);}}然后填充GridView:
private GridView gridView = null;private ImageAdapter menu = null;private LinearLayout content = null;private int menu_img[] = new int[] { R.drawable.home_select,R.drawable.note_select, R.drawable.music, R.drawable.msg };private int width = 0;private int height = 0;private Intent intent = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);this.gridView = (GridView) super.findViewById(R.id.gridView);this.content = (LinearLayout) super.findViewById(R.id.content);this.gridView.setNumColumns(this.menu_img.length);this.gridView.setSelector(new ColorDrawable(Color.TRANSPARENT));this.gridView.setGravity(Gravity.CENTER);this.gridView.setVerticalSpacing(0);this.gridView.setBackgroundColor(Color.DKGRAY);this.width = super.getWindowManager().getDefaultDisplay().getWidth()/ this.menu_img.length;this.height = super.getWindowManager().getDefaultDisplay().getHeight() / 8;this.menu = new ImageAdapter(this, this.menu_img, this.width,this.height, R.drawable.menu_back);this.gridView.setAdapter(this.menu);//this.switchActivity(0);//this.gridView.setOnItemClickListener(new OnItemClickListenerImpl());}至此显示是好了,下面就是触发点击事件了,关键代码如下:
private class OnItemClickListenerImpl implements OnItemClickListener {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {MainActivity.this.switchActivity(position);}}private void switchActivity(int id) {this.menu.setFocus(id);this.content.removeAllViews();switch (id) {case 0:this.intent = new Intent(MainActivity.this, HomeActivity.class);break;case 1:this.intent = new Intent(MainActivity.this, NoteActivity.class);break;case 2:this.intent = new Intent(MainActivity.this, MusicActivity.class);break;case 3:this.intent = new Intent(MainActivity.this, MsgActivity.class);break;case 4:this.exitDialog();break;default:Toast.makeText(MainActivity.this, "switchActivity的id不在范围内",Toast.LENGTH_LONG).show();break;}this.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);Window subActivity = this.getLocalActivityManager().startActivity("subActivity", this.intent);this.content.addView(subActivity.getDecorView(),LayoutParams.FILL_PARENT);}先根据点击的项获得对应的编号,然后分支判断,跳转到指定的页面,关键语句是最后两句:
Window subActivity = this.getLocalActivityManager().startActivity("subActivity", this.intent);this.content.addView(subActivity.getDecorView(),LayoutParams.FILL_PARENT);这个控制显示在MainActivity这个页面上。
至此框架完成,其他要注意的细节:这边在选中时添加了个背景图片以便醒目;各个页面的图片显示问题,我这边采用了跟手机一样像素的图片才正好铺满屏幕,开始弄的图片像素太低,就只在屏幕的左上边显示;图标和最好采用无背景的图片(相对背景为白色的,透明更美观);只要涉及到多页面就要记得在AndroidManifest.xml中配置进去;
运行截图如下:
2.采用继承FragmentActivity和RadioButton相组合实现
该方法的关键之处是FragmentActivity的getSupportFragmentManager方法,通过它来控制Fragment布局页面的显示和隐藏。主界面采用相对布局,本例有四个Fragment页面和一组RadioButton,代码如下:<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="com.example.drawer0817.MainActivity" > <fragment android:id="@+id/farment_home" android:layout_width="fill_parent" android:layout_height="match_parent" class="com.example.drawer0817.HomeFrament" /> <fragment android:id="@+id/farment_note" android:layout_width="fill_parent" android:layout_height="match_parent" class="com.example.drawer0817.NoteFrament" /> <fragment android:id="@+id/farment_music" android:layout_width="fill_parent" android:layout_height="match_parent" class="com.example.drawer0817.MusicFrament" /> <fragment android:id="@+id/farment_msg" android:layout_width="fill_parent" android:layout_height="match_parent" class="com.example.drawer0817.MsgFrament" /> <RadioGroup android:layout_width="match_parent" android:layout_height="55dp" android:layout_alignParentBottom="true" android:orientation="horizontal" > <RadioButton android:layout_width="0dp" android:layout_height="55dp" android:layout_weight="1" android:background="@drawable/selector_common" android:button="@null" android:drawableTop="@drawable/selector_home" android:onClick="homeClick" /> <RadioButton android:layout_width="0dp" android:layout_height="55dp" android:layout_weight="1" android:background="@drawable/selector_common" android:button="@null" android:drawableTop="@drawable/selector_note" android:onClick="noteClick" /> <RadioButton android:layout_width="0dp" android:layout_height="55dp" android:layout_weight="1" android:background="@drawable/selector_common" android:button="@null" android:drawableTop="@drawable/music" android:onClick="musicClick" /> <RadioButton android:layout_width="0dp" android:layout_height="55dp" android:layout_weight="1" android:background="@drawable/selector_common" android:button="@null" android:drawableTop="@drawable/msg" android:onClick="msgClick" /> </RadioGroup></RelativeLayout>可以看到四个fragment是写在一起的,实际运行时跟据需要显示其中一个。主界面后台代码主要干两件事,收集fragment和根据点击事件控制fragment的显示和隐藏,这个只要看看代码就能明白啥意思了:
package com.example.drawer0817;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.view.View;import android.view.Window;public class MainActivity extends FragmentActivity {private Fragment[] fragments;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);fragments = new Fragment[4];fragments[0] = getSupportFragmentManager().findFragmentById(R.id.farment_home);fragments[1] = getSupportFragmentManager().findFragmentById(R.id.farment_note);fragments[2] = getSupportFragmentManager().findFragmentById(R.id.farment_music);fragments[3] = getSupportFragmentManager().findFragmentById(R.id.farment_msg);getSupportFragmentManager().beginTransaction().hide(fragments[1]).hide(fragments[2]).hide(fragments[3]).show(fragments[0]).commit();}public void homeClick(View view) {getSupportFragmentManager().beginTransaction().hide(fragments[1]).hide(fragments[2]).hide(fragments[3]).show(fragments[0]).commit();}public void noteClick(View view) {getSupportFragmentManager().beginTransaction().hide(fragments[0]).hide(fragments[2]).hide(fragments[3]).show(fragments[1]).commit();}public void musicClick(View view) {getSupportFragmentManager().beginTransaction().hide(fragments[0]).hide(fragments[1]).hide(fragments[3]).show(fragments[2]).commit();}public void msgClick(View view) {getSupportFragmentManager().beginTransaction().hide(fragments[0]).hide(fragments[1]).hide(fragments[2]).show(fragments[3]).commit();}}然后fragment布局页面代码如下,为了跟第一个例子有所区分,这边四个页面没有合在一起(可以合在一起),这边以第一个为例,其他几个跟这个一模一样,就不写了:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/imageView_Back" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="fitXY"/></LinearLayout>相对应的后台代码如下:
package com.example.drawer0817;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;public class HomeFrament extends Fragment {ImageView imageView=null;public HomeFrament() {}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View rootView = inflater.inflate(R.layout.farment_home, container,false);imageView=(ImageView)rootView.findViewById(R.id.imageView_Back);imageView.setImageResource(R.drawable.home_back);return rootView;}}至此框架完成,这个例子也是有可圈可点的地方,关键看drawable这个文件夹。通过selector控制按钮的背景色随着按钮的状态而变化,可分别设置未点击时和被点击时的样式;另外可以根据shape控制边框、圆角、阴影等,具体可自行搜索学习;
项目运行截图跟上例类似:
后记,看这截图,感觉有点样子了,至少比前面写的例子好多了,不过花的时间也不少,整整一天就弄了这两个例子,些许欣慰。
至此全部完成,只是个人的一些实践,对自己是一个记录,同时希望也能对别人有些帮助,如果有什么错误,还望不吝指出,共同进步,转载请保留原文地址。
项目源码下载
0 0
- Android工具导航栏
- Android地图导航工具 - mapsforge
- Android主界面导航工具
- android底部导航栏
- android底部导航栏
- Android导航栏--ActionBar
- Android 隐藏导航栏
- Android底部导航栏
- android 导航栏透明
- android 底部导航栏
- Android 通讯录导航栏
- android自定义导航栏
- android底部导航栏
- android实现导航栏
- TabLayout用法,android顶部导航栏,android底部导航栏
- TabLayout用法,android顶部导航栏,android底部导航栏
- Android导航Tab栏实现
- Android 实现底部导航栏
- zoj 2788 网络流sap+最小割
- JavaScript面向对象之类的创建
- JavaScript 异步编程
- AVD那些事儿
- NOJ1437——[1437] Shutdown
- Android工具导航栏
- 剖析IoAttachDevice的实现
- rpm 强制安装
- 又是一个夏天要过去了
- servlet的两种配置
- 2014.08.18 周一-JSP-div-css-Maven-web服务器
- Struts2.1权威指南里的一些不熟悉的概念
- linux常用命令
- Activiti5.9 流程实例中同一个流程businessKey重复的问题