Android开发主页框架搭建
2016-01-16 19:20
561 查看
刚开始学Android时,一直想着搭建一个类似微信的主界面一样的框架,点击底部的按钮后切换到相应的界面,在学习了Android 几个月后,开始要做项目了,然后接到的第一个项目就有这样的要求(好像市面主流的app都是这样布局)。 经过几天的研究,最后我敲定了利用android.support.v4.view.ViewPager
+Fragment 和RadioButton实现。ViewPager中嵌入Fragment可以顺畅地滑动,RadioButton使得底部按钮始终只有一个被选中,不会出现两个按钮同时被选中情况。最终的效果如下:
这只是测试的效果,不是真正的项目,直接代码:
1.主布局文件activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/ll_home" android:layout_width="match_parent" android:layout_height="50dp" android:background="#ff1df8d2"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="@string/topt_itle" android:textColor="#fff" android:textSize="20sp" /> </LinearLayout> <RadioGroup android:id="@+id/rg_home" android:layout_width="match_parent" android:layout_height="50dp" android:layout_alignParentBottom="true" android:background="#fffceae5" android:orientation="horizontal"> <RadioButton android:id="@+id/rb_home_weibo" style="@style/style_RadioButton" android:drawableTop="@drawable/home_weibo_draw" android:text="@string/weibo_text" android:checked="true"/> <RadioButton android:id="@+id/rb_home_news" style="@style/style_RadioButton" android:drawableTop="@drawable/home_news_draw" android:text="@string/news_text" /> <RadioButton android:id="@+id/rb_home_my" style="@style/style_RadioButton" android:drawableTop="@drawable/home_my_draw" android:text="@string/my_text" /> </RadioGroup> <android.support.v4.view.ViewPager android:id="@+id/vp_home" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@id/rg_home" android:layout_below="@id/ll_home"> </android.support.v4.view.ViewPager> </RelativeLayout>
主布局文件暂时没有涉及其他,所以比较简单,主要是一个LinerLayout布局作为顶部布局,实际可以根据需要进行改,然后底部直接是一个RadioGroup,在里面装入RadioButton,中间再放一个ViewPager。该文件中引用了大量的样式文件,还有一个图片选择器和颜色选择器,详情可以看工程源码。 2.颜色选择器colors.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:color="@color/home_checked" /> <item android:state_checked="false" android:color="@color/home_unchecked" /> </selector>
选择器的属性很多,这里只做了选中和不被选中的效果,其他可以根据客户需求进行调整。图片选择器类似,不在重复列出。 3.建立Fragment布局,在创建Fragment时直接为其创建布局
import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.hais.activity.hais_app.R; public class WeiboFragment extends Fragment { public WeiboFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_weibo, container, false); } }
因为还没开始写里面的东西,所有比较简单,布局xml文件和另外两个Fragment文件不再重复列出。 4.主要还是在MainActivity.java文件中处理
public class MainActivity extends FragmentActivity { private RadioGroup rg; private ViewPager vp; /* * 注意Fragment和viewpager中引入的包必须一直 * */ private List<Fragment> fragments = new ArrayList<>(); private FragmentPagerAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initViewPager(); initEvent(); } /* * 初始化界面 * */ private void initView() { rg = (RadioGroup) findViewById(R.id.rg_home); vp = (ViewPager) findViewById(R.id.vp_home); fragments.add(new WeiboFragment()); fragments.add(new NewsFragment()); fragments.add(new MyFragment()); } /* * 初始化ViewPager * */ private void initViewPager() { adapter = new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public Fragment getItem(int position) { return fragments.get(position); } @Override public int getCount() { return fragments.size(); } }; vp.setOffscreenPageLimit(1);//缓存页面个数 vp.setCurrentItem(0);//默认选中第一个 vp.setAdapter(adapter); } private void initEvent() { /* *viewpager滑动时使radioButton选中状态 * */ vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { switch(position){ case 0: rg.check(R.id.rb_home_weibo); break; case 1: rg.check(R.id.rb_home_news); break; case 2: rg.check(R.id.rb_home_my); break; default: break; } } @Override public void onPageScrollStateChanged(int state) { } }); /* * 选中RadioGroup时切换界面 * */ rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup radioGroup, int checkId) { switch (checkId){ case R.id.rb_home_weibo: vp.setCurrentItem(0,false); break; case R.id.rb_home_news: vp.setCurrentItem(1,false); break; case R.id.rb_home_my: vp.setCurrentItem(2,false); break; } } }); } }
咋一看代码还听简单的哦,确实也简单,主要流程大概是收集到Fragment将其传给FragmentPagerAdapter,告诉其有几个页面。然后就是对ViewPager进行监听,监听其滑动的状态,然后给RadioGroup中的RadioButton赋值(滑动时底部tag跟着改变)。然后是监听RadioGroup,当选择不同的RadioButton时给取出对应的Fragment,简单的说就是两者相互关联。 到此,简单的app框架就搭建得差不多了,有点简单,还有缺点,望见谅。 对于部分app的滑动页面是不需要的滑动的,如QQ,淘宝等,如果需要禁止滑动需要对ViewPager进行自定义。说到自定义听起来很麻烦的样子,其实对与本功能,非常简单,只要将重写的onTouchEvent(MotionEvent arg0)和onInterceptTouchEvent(MotionEvent arg0)方法的返回值改为flase即可。
源码下载
相关文章推荐
- 个人信息安全报告发布:有 APP 每分钟调用位置权限 1468 次
- 下载量超过一亿的流行应用被发现含有恶意模块
- Android实现表情 抓取新浪表情
- 详解Android解析Xml的三种方式——DOM、SAX以及XMLpull
- 苹果与Siri的七年之痒:“宫斗”戏码不断上演
- 插件管理框架 for Delphi(一)
- 使用CSS框架布局的缺点和优点小结
- APP添加CNZZ统计插件教程 Android版添加phonegap
- 列举PHP的Yii 2框架的开发优势
- Windows窗体的.Net框架绘图技术实现方法
- 浅谈JavaScript 框架分类
- 轻量级javascript 框架Backbone使用指南
- javascript实现框架高度随内容改变的方法
- JS刷新框架外页面七种实现代码
- 超赞的动手创建JavaScript框架的详细教程
- 深入探讨前端框架react
- Android APP与媒体存储服务的交互
- 简单介绍不用库(框架)自己写ajax
- asp.net4.0框架下验证机制失效的原因及处理办法
- 插件管理框架 for Delphi(二)