您的位置:首页 > 移动开发 > Android开发

Android里的底部页面的切换的实现的三种方式

2014-09-15 19:09 513 查看

底部页面的切换

实现方式有三种:

1. tabhost+Activity的方式:

1.将MainActivity继承TabActivity

2.在setContentView();(不一定紧跟随)之后获取TabHost对象<只有继承了TabActivity才能获取得到TabHost对象> getTabHost()

3.创建Intent对象用来显示每个Tab页面.

4.创建tabSpec对象用来添加进tabHost里的:

TabSpec tabSpec1 = tabHost.newTabSpec("two").setIndicator("",
getResources().getDrawable(R.drawable.home_press2))
.setContent(intent1);

其中:设置标签和图标(setIndicator),设置内容(setContent)

5.添加进tabHost里

tabHost.add(tabSpec1);

6.注意的是对main.xml文件的编写:tabHost使用了特殊的标签id定义,在main.xml文件一定是tabHost标签包裹起来的,注意id:

<TabHost 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"
android:id="@android:id/tabhost">
<!--注意这的id:tabhost,tabs,tabcontent都是特有的一定要有,否则回运行异常-->
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent">

<TabWidget android:id="@android:id/tabs"
android:layout_alignParentBottom="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>

<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

</LinearLayout>
</TabHost>


7.关于tabhost+Activity的方式:这种方式以及废弃掉了,因为实现它需要一个界面一个Activity,在Android中Activity属于重量级空间,最好不轻易使用,所以抛弃掉了.

2.fragment嵌套fragment:

在早期开发过程中,fragment是不能嵌套fragment的。
是在4.2以后才有的,然后在v13包里面才有这个方法。
如何使用fragment嵌套fragment的开发方式的话,布局层次会嵌套太深,导致程序崩掉

3.ViewPage:

1.使用Frgment和Viewpage实现标签布局(没有用框架的)

1.因为需要用到Frgment所以MainActivity继承下FrgmentActivity

2.因为要需要在操作栏中添加标签,必须要实现ActionBar.TabListener这个类--->可能会不能自动导包

import android.app.ActionBar;
public class MainActivity extends FragmentActivity implements ActionBar.TabListener{
//一下是需实现ActionBar.TabListener接口的方法
public void onTabSelected(Tab tab, FragmentTransaction ft) {}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {}
public void onTabReselected(Tab tab, FragmentTransaction ft) {}
}


3.MainActivity布局文件的编写(注意,这个文件除了viewpage其他元素都不写):

<android.support.v4.view.ViewPager 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"
android:id="@+id/main_vp"
tools:context=".MainActivity" >
</android.support.v4.view.ViewPager>


4.创建便签碎片(tab fragment)提供视图的FragmentPagerAdapter类(适配器)

class TabsPagerAdapter extends FragmentPagerAdapter{

public TabsPagerAdapter(FragmentManager fm) {
super(fm);
// TODO Auto-generated constructor stub
}

@Override
public Fragment getItem(int arg0) {
switch(arg0){
case 0:
return new TopRatedFragment();
case 1:
return new GameFragment();
case 2:
return new MovesFragment();
}
return null;
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return 3;
}

}


5.为ActionBar添加Tab在不使用其他UI元素,譬如TabHost的前提下显示标签,其实在操作栏中有一个内置的功能,那就是添加标签。很简单的,我们需要做的就是允许操作栏使用setNavigationMode(ActionBar.NAVIGATIONMODETABS)方法。

private String[] tabs = {"Top Rated", "Games", "Movies"};
private ActionBar actionBar;
actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Adding Tabs
for (String tab_name : tabs) {
actionBar.addTab(actionBar.newTab()
.setText(tab_name)
.setTabListener(this));//先前已经实现了该监听接口
}


6.为标签添加视图

//写个基本的Fragment的类,为TopRatedFragment(),GameFragment(),MovesFragment()提供方便,它们就可以直接实现initData(),initView()方法就得了.
public abstract class BaseFragment extends Fragment {

private String TAG = "BaseFragment";

public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
Log.i(TAG, this.getClass().getSimpleName()+"====onCreate");
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
Log.i(TAG, this.getClass().getSimpleName()+"====onCreateView");
View view = initView();

return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
Log.i(TAG, this.getClass().getSimpleName()+"====onActivityCreated");
initData();
super.onActivityCreated(savedInstanceState);
}
public abstract void initData();
public abstract View initView();
}

2.用框架SlidingMenu实现

1.SlidingMenu属性的一些介绍:

menu.setMode(SlidingMenu.LEFT);//设置左滑菜单
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//设置滑动的屏幕范围,该设置为全屏区域都可以滑动
menu.setShadowDrawable(R.drawable.shadow);//设置阴影图片
menu.setShadowWidthRes(R.dimen.shadow_width);//设置阴影图片的宽度
menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);//SlidingMenu划出时主页面显示的剩余宽度
menu.setBehindWidth(400);//设置SlidingMenu菜单的宽度
menu.setFadeDegree(0.35f);//SlidingMenu滑动时的渐变程度
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);//使SlidingMenu附加在Activity上
menu.setMenu(R.layout.menu_layout);//设置menu的布局文件
menu.toggle();//动态判断自动关闭或开启SlidingMenu
menu.showMenu();//显示SlidingMenu
menu.showContent();//显示内容
menu.setOnOpenListener(onOpenListener);//监听slidingmenu打开
关于关闭menu有两个监听,简单的来说,对于menu close事件,一个是when,一个是after
menu.OnClosedListener(OnClosedListener);//监听slidingmenu关闭时事件
menu.OnClosedListener(OnClosedListener);//监听slidingmenu关闭后事件
左右都可以划出SlidingMenu菜单只需要设置
menu.setMode(SlidingMenu.LEFT_RIGHT);属性,然后设置右侧菜单的布局文件
menu.setSecondaryShadowDrawable(R.drawable.shadowright);//右侧菜单的阴影图片
设置SlidingMenu属性
sm = getSlidingMenu();
//如果只显示左侧菜单就是用LEFT,右侧就RIGHT,左右都支持就LEFT_RIGHT
sm.setMode(SlidingMenu.LEFT_RIGHT);//设置菜单滑动模式,菜单是出现在左侧还是右侧,还是左右两侧都有
sm.setShadowDrawable(R.drawable.shadow);//设置阴影的图片资源
sm.setShadowWidthRes(R.dimen.shadow_width);//设置阴影图片的宽度
//sm.setBehindWidth(200);//设置菜单的宽
sm.setBehindOffsetRes(R.dimen.slidingmenu_offset);//SlidingMenu划出时主页面显示的剩余宽度
sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//设置滑动的区域
支持右侧划出菜单:
//SlidingMenu可以同时支持划出左右两侧的菜单,互不冲突,而且动画优美,体验良好。
sm.setSecondaryMenu(R.layout.menu_frame2);//设置右侧菜单
sm.setSecondaryShadowDrawable(R.drawable.shadowright);//设置右侧菜单阴影的图片资源
//右侧SlidingMenu的Fragment
getSupportFragmentManager().beginTransaction().replace(R.id.menu_frame2, new SampleListFragment()).commit();
slidingMenu = getSlidingMenu();
//设置是左滑还是右滑,还是左右都可以滑
slidingMenu.setMode(SlidingMenu.LEFT_RIGHT);
//设置阴影宽度
slidingMenu.setShadowWidth(getWindowManager().getDefaultDisplay().getWidth() / 40);
//设置左菜单阴影图片
slidingMenu.setShadowDrawable(R.drawable.shadow);
//设置右菜单阴影图片
slidingMenu.setSecondaryShadowDrawable(R.drawable.right_shadow);
//设置菜单占屏幕的比例
slidingMenu.setBehindOffset(getWindowManager().getDefaultDisplay().getWidth() / 5);
//设置滑动时菜单的是否淡入淡出
slidingMenu.setFadeEnabled(true);
//设置淡入淡出的比例
slidingMenu.setFadeDegree(0.4f);
//设置滑动时拖拽效果
slidingMenu.setBehindScrollScale(0);
//设置要使菜单滑动,触碰屏幕的范围
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);


2.应用: 1.将Activity页继承SlidingFragmentActivity 2.设置边侧拉出菜单布局和主页面内容布局 3.写个dimens.xml文件,用来配置SlidingMenu的一些配置.

<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="slidingmenu_offset">180dp</dimen>
<dimen name="list_padding">10dp</dimen>
<dimen name="shadow_width">5dp</dimen>
<dimen name="bottom_tab_padding_drawable">2.0dip</dimen>
<dimen name="bottom_tab_padding_up">2.0dip</dimen>
<dimen name="bottom_tab_font_size">14.0sp</dimen>

</resources>


4.写个shadow.xml文件用来配置阴影的一些信息

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:endColor="#5A000000"
android:centerColor="#2D000000"
android:startColor="#00000000" />
</shape>

5.初始化(配置)下 ---获取侧边栏对象 ---设置成左侧...

slidingMenu = getSlidingMenu();
slidingMenu.setMode(SlidingMenu.LEFT);
slidingMenu.setShadowWidthRes(R.dimen.shadow_width);//阴影宽度
slidingMenu.setShadowDrawable(R.drawable.shadow);//阴影Drawable
slidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset);//拉开后离边框距离
slidingMenu.setFadeDegree(0.35f); //颜色渐变比例
//slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN); //拉动事件区域  --全屏
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); //拉动事件区域  --全屏
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐