为了提高屏幕的复用,摒弃Activity重量级的页面加载,android提供了fragment这种轻量级的控件,她和Activity一样有生命周期,同时又依附于Activity
下面,主要介绍在一个Activity里加载多个fragment来复用屏幕,实现tab导航栏的效果。
点击下面的位置,物品,时间会切换到不同的搜索页面,就这这个效果。
一个Activity加上了三个fragment
上代码:
<?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" > <include layout="@layout/head2_item"/> <FrameLayout android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:id="@+id/id_viewPager" /> <include layout="@layout/bottom"/> </LinearLayout>
在activity_search.xml文件中,head2_item是导入的一个标题栏文件,bottom是底部的菜单栏,剩下的屏幕控件由一个FrameLayout布局实现。
head2_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/light_blue" android:orientation="horizontal" > <ImageView android:id="@+id/backBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="0dp" android:layout_marginRight="0dp" android:background="@drawable/back_btn" android:onClick="exit" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:src="@drawable/base_action_bar_back_divider" /> <TextView android:id="@+id/headTV" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="4dp" android:layout_weight="1" android:text="" android:textColor="@color/white" android:textSize="21sp" android:textStyle="bold" android:maxLines="1" android:gravity="center" > </TextView> <ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:visibility="gone" /> <ImageView android:id="@+id/comment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:src="@drawable/comment_btn" /> </LinearLayout>
bottom.xml
<?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="45dp" android:orientation="horizontal" android:background="@color/bg_gray" > <LinearLayout android:layout_height="fill_parent" android:layout_width="0dp" android:layout_weight="1" android:orientation="vertical" android:id="@+id/linear01" > <TextView android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/tvSelect1" android:text="位置" android:gravity="center" android:textColor="@color/txt_orange" android:textSize="20sp" /> </LinearLayout> <LinearLayout android:layout_height="fill_parent" android:layout_width="0dp" android:layout_weight="1" android:orientation="vertical" android:id="@+id/linear02" > <TextView android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/tvSelect2" android:text="物品" android:gravity="center" android:textColor="@color/txt_orange" android:textSize="20sp" /> </LinearLayout> <LinearLayout android:layout_height="fill_parent" android:layout_width="0dp" android:layout_weight="1" android:orientation="vertical" android:id="@+id/linear03" > <TextView android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/tvSelect3" android:text="时间" android:gravity="center" android:textColor="@color/txt_orange" android:textSize="20sp" /> </LinearLayout> </LinearLayout>
以上就是主Activity的xml文件。
三个fragment文件都是再onCreateView方法里,记载各个fragment的视图,
最主要的Activity的代码
package com.suijianlab.cupboard; import java.util.List; import android.content.res.Resources; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.View; import android.view.View.OnClickListener; import android.widget.LinearLayout; import android.widget.TextView; import com.lin.fragment.AdressFragment; import com.lin.fragment.GoodsFragment; import com.lin.fragment.TimeFragment; import com.lin.pojo.BarCode; import com.lin.utils.MyApplication; import com.lin.utils.UsualUtil; public class SearchActivity extends FragmentActivity implements OnClickListener{ //三个linearlayout是三个底部导航的各个模块 private LinearLayout mTabAddress; private LinearLayout mTabGoods; private LinearLayout mTabTime; //三个fragment是替换Activity中间的FrameLayout使用的 private Fragment mtab01; private Fragment mtab02; private Fragment mtab03; //把图片资源的引用作为成员变量 private Resources res; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); UsualUtil.hintTitles(this);//这个是我工具类的一个方法,用于隐藏标题栏 setContentView(R.layout.activity_search); MyApplication.getInstance().addActivity(this);//收集Activity TextView textViewTitle =(TextView)findViewById(R.id.headTV); textViewTitle.setText("查询"); initView(); initEvents(); setSelect(0); } private void setSelect(int i) { // TODO Auto-generated method stub FragmentManager fm=getSupportFragmentManager(); FragmentTransaction transaction=fm.beginTransaction();拿事务 hideFragment(transaction); switch (i) { case 0:{ mTabAddress.setBackgroundColor(res.getColor(R.color.black_pressed));//点亮 if(mtab01==null){ mtab01=new AdressFragment(); transaction.add(R.id.id_viewPager,mtab01);//添加到//framelayout中 }else{ transaction.show(mtab01);//显示 } break; } case 1:{ mTabGoods.setBackgroundColor(res.getColor(R.color.black_pressed)); if(mtab02==null){ mtab02=new GoodsFragment(); transaction.add(R.id.id_viewPager, mtab02); }else{ transaction.show(mtab02); } break; } case 2:{ mTabTime.setBackgroundColor(res.getColor(R.color.black_pressed)); if(mtab03==null){ mtab03=new TimeFragment(); transaction.add(R.id.id_viewPager, mtab03); }else{ transaction.show(mtab03); } break; } default: break; } transaction.commit(); } private void hideFragment(FragmentTransaction transaction) { // TODO Auto-generated method stub if(mtab01!=null){ transaction.hide(mtab01); } if(mtab02!=null){ transaction.hide(mtab02); } if(mtab03!=null){ transaction.hide(mtab03); } } private void initEvents() { // TODO Auto-generated method stub mTabAddress.setOnClickListener(this); mTabGoods.setOnClickListener(this); mTabTime.setOnClickListener(this); } private void initView() { // TODO Auto-generated method stub mTabAddress=(LinearLayout) findViewById(R.id.linear01); mTabGoods=(LinearLayout) findViewById(R.id.linear02); mTabTime=(LinearLayout) findViewById(R.id.linear03); res=getResources(); } //linearlayout的点击事件 @Override public void onClick(View v) { // TODO Auto-generated method stub reset();//先是重置三个按钮的颜色 switch (v.getId()){ case R.id.linear01: setSelect(0);//调用方法,显示相应的fragment,把底部设为选中 break; case R.id.linear02: setSelect(1); break; case R.id.linear03: setSelect(2); break; default: break; } } private void reset(){ mTabAddress.setBackgroundColor(res.getColor(R.color.bg_gray)); mTabGoods.setBackgroundColor(res.getColor(R.color.bg_gray)); mTabTime.setBackgroundColor(res.getColor(R.color.bg_gray)); } public void exit(View view){ finish(); } }
这种方式的弊端是不能向Viewpager那样滑动,但是每一个导航条的内容是分割开来的,大大地降低了耦合,使得各个模块互不干扰,代码也不是很臃肿