【Android进阶】使用Andbase快速开发框架实现常见侧滑栏和滑动标签页组合效果
最近闲来无事,在网上寻找源代码看,突然发现了一个国内技术牛人开发的快速开发框架Andbase,花了一天时间研究了下源码和怎么使用,现将开发常见的侧滑栏和滑动标签页组合效果的使用介绍个大家,希望可以减少大家的开发难度
老样子,先上效果图
ok,下面开始介绍如何使用andbase快速开发框架,实现这种常见的界面效果
工程包结构
利用andbase框架开发的一个应用叫做“Android开发宝”,里面的源码详细的介绍了各种效果的使用,功能十分强大,有兴趣的最好可以研究下源码,收获颇丰,由于代码注释很多,我就直接贴代码了
SlidingMenuNestTabActivity.java
package com.example.andbaseexample; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import com.ab.activity.AbActivity; import com.ab.view.slidingmenu.SlidingMenu; import com.ab.view.titlebar.AbTitleBar; /** * 碎片的容器,主Activity * * @author ZhaoKaiQiang * * Time:2014年3月3日 */ public class SlidingMenuNestTabActivity extends AbActivity { private SlidingMenu menu; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setAbContentView(R.layout.sliding_menu_content); AbTitleBar mAbTitleBar = this.getTitleBar(); mAbTitleBar.setTitleText("侧滑栏"); mAbTitleBar.setLogo(R.drawable.button_selector_back); mAbTitleBar.setTitleBarBackground(R.drawable.top_bg); mAbTitleBar.setTitleTextMargin(10, 0, 0, 0); mAbTitleBar.setLogoLine(R.drawable.line); mAbTitleBar.getLogoView().setBackgroundResource( R.drawable.button_selector_menu); // 主视图的Fragment添加 getSupportFragmentManager().beginTransaction() .replace(R.id.content_frame, new SlidingTabFragment()).commit(); // SlidingMenu的配置 menu = new SlidingMenu(this); menu.setMode(SlidingMenu.LEFT); // slidingmenu的事件模式,如果里面有可以滑动的请用TOUCHMODE_MARGIN // 可解决事件冲突问题 menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN); menu.setShadowWidthRes(R.dimen.shadow_width); menu.setShadowDrawable(R.drawable.shadow); menu.setBehindOffsetRes(R.dimen.slidingmenu_offset); menu.setFadeDegree(0.35f); menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT); // menu视图的Fragment添加 menu.setMenu(R.layout.sliding_menu_menu); getSupportFragmentManager().beginTransaction() .replace(R.id.menu_frame, new Fragment1()).commit(); mAbTitleBar.getLogoView().setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { if (menu.isMenuShowing()) { menu.showContent(); } else { menu.showMenu(); } } }); } @Override public void onBackPressed() { if (menu.isMenuShowing()) { menu.showContent(); } else { super.onBackPressed(); } } }
SlidingTabFragment.java
package com.example.andbaseexample; import java.util.ArrayList; import java.util.List; import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.ab.view.sliding.AbSlidingTabView; /** * 活动标签碎片 * @author ZhaoKaiQiang * * Time:2014年3月3日 */ public class SlidingTabFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.sliding_tab, null); AbSlidingTabView mAbSlidingTabView = (AbSlidingTabView) view .findViewById(R.id.mAbSlidingTabView); // 如果里面的页面列表不能下载原因: // Fragment里面用的AbTaskQueue,由于有多个tab,顺序下载有延迟,还没下载好就被缓存了。改成用AbTaskPool,就ok了。 // 或者setOffscreenPageLimit(0) // 缓存数量 mAbSlidingTabView.getViewPager().setOffscreenPageLimit(5); Fragment1 page1 = new Fragment1(); Fragment1 page2 = new Fragment1(); Fragment1 page3 = new Fragment1(); Fragment1 page4 = new Fragment1(); Fragment1 page5 = new Fragment1(); List<Fragment> mFragments = new ArrayList<Fragment>(); mFragments.add(page1); mFragments.add(page2); mFragments.add(page3); mFragments.add(page4); mFragments.add(page5); List<String> tabTexts = new ArrayList<String>(); tabTexts.add("推荐"); tabTexts.add("排行"); tabTexts.add("游戏中心"); tabTexts.add("专题栏目"); tabTexts.add("咖啡屋"); // 设置样式 mAbSlidingTabView.setTabTextColor(Color.BLACK); mAbSlidingTabView.setTabSelectColor(Color.rgb(30, 168, 131)); mAbSlidingTabView.setTabBackgroundResource(R.drawable.tab_bg); mAbSlidingTabView.setTabLayoutBackgroundResource(R.drawable.slide_top); // 演示增加一组 mAbSlidingTabView.addItemViews(tabTexts, mFragments); // 演示增加一个 // mAbSlidingTabView.addItemView("咖啡屋", page5); mAbSlidingTabView.setTabPadding(20, 8, 20, 8); return view; } public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } }
ImageListAdapter.java
package com.example.andbaseexample; import java.util.List; import java.util.Map; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import com.ab.bitmap.AbImageDownloader; import com.ab.global.AbConstant; /** * 碎片中的图片列表适配器 * @author ZhaoKaiQiang * * Time:2014年3月3日 */ public class ImageListAdapter extends BaseAdapter{ private Context mContext; //xml转View对象 private LayoutInflater mInflater; //单行的布局 private int mResource; //列表展现的数据 private List mData; //Map中的key private String[] mFrom; //view的id private int[] mTo; //图片下载器 private AbImageDownloader mAbImageDownloader = null; /** * 构造方法 * @param context * @param data 列表展现的数据 * @param resource 单行的布局 * @param from Map中的key * @param to view的id */ public ImageListAdapter(Context context, List data, int resource, String[] from, int[] to){ this.mContext = context; this.mData = data; this.mResource = resource; this.mFrom = from; this.mTo = to; //用于将xml转为View this.mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); //图片下载器 mAbImageDownloader = new AbImageDownloader(mContext); mAbImageDownloader.setWidth(100); mAbImageDownloader.setHeight(100); mAbImageDownloader.setType(AbConstant.SCALEIMG); mAbImageDownloader.setLoadingImage(R.drawable.image_loading); mAbImageDownloader.setErrorImage(R.drawable.image_error); mAbImageDownloader.setNoImage(R.drawable.image_no); //mAbImageDownloader.setAnimation(true); } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position){ return position; } @Override public View getView(int position, View convertView, ViewGroup parent){ final ViewHolder holder; if(convertView == null){ //使用自定义的list_items作为Layout convertView = mInflater.inflate(mResource, parent, false); //减少findView的次数 holder = new ViewHolder(); //初始化布局中的元素 holder.itemsIcon = ((ImageView) convertView.findViewById(mTo[0])) ; holder.itemsTitle = ((TextView) convertView.findViewById(mTo[1])); holder.itemsText = ((TextView) convertView.findViewById(mTo[2])); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } //获取该行的数据 final Map<String, Object> obj = (Map<String, Object>)mData.get(position); String imageUrl = (String)obj.get("itemsIcon"); holder.itemsTitle.setText((String)obj.get("itemsTitle")); holder.itemsText.setText((String)obj.get("itemsText")); //设置加载中的View mAbImageDownloader.setLoadingView(convertView.findViewById(R.id.progressBar)); //图片的下载 mAbImageDownloader.display(holder.itemsIcon,imageUrl); return convertView; } /** * View元素 */ static class ViewHolder { ImageView itemsIcon; TextView itemsTitle; TextView itemsText; ImageButton itemsBtn; } }
Fragment1.java
package com.example.andbaseexample; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import android.app.Activity; 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.AdapterView; import android.widget.AdapterView.OnItemClickListener; import com.ab.task.AbTaskItem; import com.ab.task.AbTaskListener; import com.ab.task.AbTaskQueue; import com.ab.view.listener.AbOnListViewListener; import com.ab.view.pullview.AbPullListView; /** * Activity中嵌入的碎片 * @author ZhaoKaiQiang * * Time:2014年3月3日 */ public class Fragment1 extends Fragment { private Activity mActivity = null; private List<Map<String, Object>> list = null; private List<Map<String, Object>> newList = null; private AbPullListView mAbPullListView = null; private int currentPage = 1; private AbTaskQueue mAbTaskQueue = null; private ArrayList<String> mPhotoList = new ArrayList<String>(); private ImageListAdapter myListViewAdapter = null; private int total = 50; private int pageSize = 5; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mActivity = this.getActivity(); View view = inflater.inflate(R.layout.pull_list, null); mPhotoList.add("http://img01.taobaocdn.com/bao/uploaded/i3/13215035600700175/T1C2mzXthaXXXXXXXX_!!0-item_pic.jpg_230x230.jpg"); mPhotoList.add("http://img01.taobaocdn.com/bao/uploaded/i2/13215025617307680/T1AQqAXqpeXXXXXXXX_!!0-item_pic.jpg_230x230.jpg"); mPhotoList.add("http://img01.taobaocdn.com/bao/uploaded/i1/13215035569460099/T16GuzXs0cXXXXXXXX_!!0-item_pic.jpg_230x230.jpg"); mPhotoList.add("http://img01.taobaocdn.com/bao/uploaded/i2/13215023694438773/T1lImmXElhXXXXXXXX_!!0-item_pic.jpg_230x230.jpg"); mPhotoList.add("http://img01.taobaocdn.com/bao/uploaded/i3/13215023521330093/T1BWuzXrhcXXXXXXXX_!!0-item_pic.jpg_230x230.jpg"); mPhotoList.add("http://img01.taobaocdn.com/bao/uploaded/i4/13215035563144015/T1Q.eyXsldXXXXXXXX_!!0-item_pic.jpg_230x230.jpg"); mPhotoList.add("http://img01.taobaocdn.com/bao/uploaded/i3/13215023749568975/T1UKWCXvpXXXXXXXXX_!!0-item_pic.jpg_230x230.jpg"); mAbTaskQueue = AbTaskQueue.getInstance(); //获取ListView对象 mAbPullListView = (AbPullListView)view.findViewById(R.id.mListView); //设置进度条的样式 mAbPullListView.getHeaderView().setHeaderProgressBarDrawable(this.getResources().getDrawable(R.drawable.progress_circular)); mAbPullListView.getFooterView().setFooterProgressBarDrawable(this.getResources().getDrawable(R.drawable.progress_circular)); //ListView数据 list = new ArrayList<Map<String, Object>>(); //使用自定义的Adapter myListViewAdapter = new ImageListAdapter(mActivity, list,R.layout.list_items, new String[] { "itemsIcon", "itemsTitle","itemsText" }, new int[] { R.id.itemsIcon, R.id.itemsTitle,R.id.itemsText }); mAbPullListView.setAdapter(myListViewAdapter); //item被点击事件 mAbPullListView.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { } }); return view; } @Override public void onStart() { super.onStart(); //定义两种查询的事件 final AbTaskItem item1 = new AbTaskItem(); item1.listener = new AbTaskListener() { @Override public void update() { list.clear(); if(newList!=null && newList.size()>0){ list.addAll(newList); myListViewAdapter.notifyDataSetChanged(); newList.clear(); } mAbPullListView.stopRefresh(); } @Override public void get() { try { Thread.sleep(1000); currentPage = 1; newList = new ArrayList<Map<String, Object>>(); Map<String, Object> map = null; for (int i = 0; i < pageSize; i++) { map = new HashMap<String, Object>(); map.put("itemsIcon",mPhotoList.get(new Random().nextInt(mPhotoList.size()))); map.put("itemsTitle", "[Fragment1]"+(i+1)); map.put("itemsText", "[Fragment1]..."+(i+1)); newList.add(map); } } catch (Exception e) { } }; }; final AbTaskItem item2 = new AbTaskItem(); item2.listener = new AbTaskListener() { @Override public void update() { if(newList!=null && newList.size()>0){ list.addAll(newList); myListViewAdapter.notifyDataSetChanged(); newList.clear(); } mAbPullListView.stopLoadMore(); } @Override public void get() { try { currentPage++; Thread.sleep(1000); newList = new ArrayList<Map<String, Object>>(); Map<String, Object> map = null; for (int i = 0; i < pageSize; i++) { map = new HashMap<String, Object>(); map.put("itemsIcon",mPhotoList.get(new Random().nextInt(mPhotoList.size()))); map.put("itemsTitle", "item上拉"+((currentPage-1)*pageSize+(i+1))); map.put("itemsText", "item上拉..."+((currentPage-1)*pageSize+(i+1))); if((list.size()+newList.size()) < total){ newList.add(map); } } } catch (Exception e) { currentPage--; newList.clear(); } }; }; mAbPullListView.setAbOnListViewListener(new AbOnListViewListener(){ @Override public void onRefresh() { mAbTaskQueue.execute(item1); } @Override public void onLoadMore() { mAbTaskQueue.execute(item2); } }); //第一次下载数据 mAbTaskQueue.execute(item1); } public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } }
最后给出源代码地址,有问题请留言