Fragment 和 FragmentActivity的使用(二)
今天继续完成剩下的学习部分,现在项目很多地方使用viewpager来提供滑动,今天记录学习viewpager配合fragment的显示,增加一个CallLogsFragment配合之前SMSListFragment
1.CallLogsFragment,主要显示手机的电话记录,这都是之前的代码,所以只要把Activity转换成Fragment就可以了,也一样,
Activity.setContentView(int) 转变成Fragment.onCreateView(View) 并且 findViewById也在里面了
Activity.onCreate() 代码 转成 Fragment.onActivityCreated()中
Activity.onResume() 代码 转成 Fragment.onResume() 中
代码如下:
- public class CallLogsFragment extends Fragment{
- private ListView vList;
- private CallPanelView vDial;
- private TextView vShowDial;
- private CallListAdapter mAdapter;
- private Animation mDialHidAnim;
- private Animation mDialShowAnim;
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- View root = inflater.inflate(R.layout.activity_calls_list_screen, null);
- vList = (ListView) root.findViewById(R.id.activity_call_list_lv);
- vShowDial = (TextView) root.findViewById(R.id.activity_call_show_dial);
- vDial = (CallPanelView) root.findViewById(R.id.dial_panel_view);
- return root;
- }
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onActivityCreated(savedInstanceState);
- prepareResourceAndData();
- bindView();
- }
- @Override
- public void onResume() {
- // TODO Auto-generated method stub
- super.onResume();
- mAdapter.setCallNumbers(CallCache.getInstance().getCallNumbers());
- }
- private void prepareResourceAndData() {
- mAdapter = new CallListAdapter(getActivity());
- mDialHidAnim = AnimationUtils.loadAnimation(getActivity().getApplicationContext(),
- R.anim.dial_panel_hidden);
- mDialHidAnim.setAnimationListener(new AnimationListener() {
- public void onAnimationStart(Animation animation) {}
- public void onAnimationRepeat(Animation animation) {}
- public void onAnimationEnd(Animation animation) {
- // End
- vShowDial.setVisibility(View.VISIBLE);
- vDial.setVisibility(View.GONE);
- }
- });
- mDialShowAnim = AnimationUtils.loadAnimation(getActivity().getApplicationContext(),
- R.anim.dial_panel_show);
- mDialShowAnim.setAnimationListener(new AnimationListener() {
- public void onAnimationStart(Animation animation) {}
- public void onAnimationRepeat(Animation animation) {}
- public void onAnimationEnd(Animation animation) {
- // End
- vShowDial.setVisibility(View.GONE);
- }
- });
- }
- private void bindView() {
- vList.setAdapter(mAdapter);
- vList.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view,
- int position, long id) {
- // TODO Auto-generated method stub
- CallItemView itemview = (CallItemView) view;
- itemview.toggleExpand();
- hidDialPanel(true);
- }
- });
- vList.setOnScrollListener(new OnScrollListener() {
- public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {}
- @Override
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- // TODO Auto-generated method stub
- if (scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
- hidDialPanel(false);
- }
- }
- });
- vDial.setPanelAnim(mDialShowAnim, mDialHidAnim);
- vShowDial.setVisibility(View.GONE);
- vShowDial.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- vDial.show();
- }
- });
- }
- private void hidDialPanel(boolean anim) {
- if (vDial.getVisibility() == View.VISIBLE) {
- if(anim){
- vDial.dismiss();
- }else{
- vDial.setVisibility(View.GONE);
- vShowDial.setVisibility(View.VISIBLE);
- }
- }
- }
- }
- }
2.对昨天主页面布局修改,增加ViewPager,去掉原有的容器framelayout:
- <?xml version="1.0" encoding="utf-8"?>
- <
- <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/door_root_content_fl"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <android.support.v4.view.ViewPager
- android:id="@+id/door_viewpager_content_vp"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1" />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="55dp"
- android:orientation="horizontal" >
- <Button
- android:id="@+id/door_menu_btn"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center"
- android:text="菜单" />
- </LinearLayout>
- </LinearLayout>
- <
- </FrameLayout>
3.V4 support 包里面已经帮我们写好了 FragmentPagerAdapter,看源码可以知道在 PageAdapter.instantiateItem中,有:
- Fragment fragment = mFragmentManager.findFragmentByTag(name);
- if (fragment != null) {
- if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
- mCurTransaction.attach(fragment);
- } else {
- fragment = getItem(position);
- if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
- mCurTransaction.add(container.getId(), fragment,
- makeFragmentName(container.getId(), itemId));
- }
可以看出
ViewPager在添加fragment
的时候先在FragmentManager里面找有没有,如果没有就会去请求PageAdapter.getItem(position)来生成
fragment,进行添加,因此我们只要重写FragmentPagerAdapter并实现getItem方法就可以了,代码如下:
- class FragmentAdapter extends FragmentPagerAdapter{
- public FragmentAdapter(FragmentManager fm) {
- super(fm);
- // TODO Auto-generated constructor stub
- }
- @Override
- public Fragment getItem(int position) {
- // TODO Auto-generated method stub
- return getPagerFragmentByPosition(position);
- }
- @Override
- public int getCount() {
- // TODO Auto-generated method stub
- return 2;
- }
- }private Fragment getPagerFragmentByPosition(int position){
- if(position == FRAG_INDEX_CALL_LOG){
- return new CallLogsFragment();
- }
- if(position == FRAG_INDEX_SMS){
- return new SMSListFragment();
- }
- return null;
- }
4.页面完整代码:
- public class DoorFragmentActivity extends FragmentActivity{
- public static final String FRAG_SMS = "sms_list_frag";
- public static final String FRAG_TEXT = "text_frag";
- public static final int FRAG_INDEX_CALL_LOG = 0;
- public static final int FRAG_INDEX_SMS = 1;
- private Fragment mTextFragment;
- private FragmentManager mFragMgr;
- private ViewPager vViewPager;
- private Button mMenuBtn;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.door_fragment_activity_layout);
- initFragments();
- bindViews();
- }
- private void bindViews(){
- mMenuBtn = (Button) findViewById(R.id.door_menu_btn);
- mMenuBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- showOutFragments(FRAG_TEXT, true);
- }
- });
- vViewPager = (ViewPager) findViewById(R.id.door_viewpager_content_vp);
- vViewPager.setAdapter(new FragmentAdapter(mFragMgr));
- }
- private void initFragments(){
- mFragMgr = getSupportFragmentManager();
- TextFragment textfrag = new TextFragment();
- textfrag.setMessage("这是 菜单界面");
- mTextFragment = textfrag;
- }
- private void showOutFragments(String tag, boolean needback){
- FragmentTransaction trans = mFragMgr.beginTransaction();
- trans.setCustomAnimations(R.anim.frag_enter,
- R.anim.frag_exit);
- trans.add(R.id.door_root_content_fl, getFragmentByTag(tag), tag);
- if(needback){
- trans.addToBackStack(tag);
- }
- trans.commit();
- }
- private Fragment getFragmentByTag(String tag){
- if(FRAG_TEXT.equals(tag)){
- return mTextFragment;
- }
- return null;
- }
- private Fragment getPagerFragmentByPosition(int position){
- if(position == FRAG_INDEX_CALL_LOG){
- return new CallLogsFragment();
- }
- if(position == FRAG_INDEX_SMS){
- return new SMSListFragment();
- }
- return null;
- }
- class FragmentAdapter extends FragmentPagerAdapter{
- public FragmentAdapter(FragmentManager fm) {
- super(fm);
- // TODO Auto-generated constructor stub
- }
- @Override
- public Fragment getItem(int position) {
- // TODO Auto-generated method stub
- return getPagerFragmentByPosition(position);
- }
- @Override
- public int getCount() {
- // TODO Auto-generated method stub
- return 2;
- }
- }
- }
- }
5.效果图,左右滑动显示通话记录和短信:
- <pre code_snippet_id="94266" snippet_file_name="blog_20131203_4_3649255"></pre>
- <pre></pre>
Fragment 和 FragmentActivity的使用(二)的更多相关文章
- Fragment和FragmentActivity的使用方法
认识:首先我们知道Fragment是我们在单个Activity上要切换多个UI界面,显示不同内容.模块化这些UI面板以便提供给其他Acitivity使用便利.同时我们显示的Fragment也会受到当前 ...
- Fragment与FragmentActivity的关系
前阵用viewpaper+fragment做滑动引导,查阅了下网上的资料,发现在有两种做法,一个是自建类直接继承Activity另一种是继承FragmentActivity,很是迷惑,在查了些goog ...
- Fragment 和 FragmentActivity的使用
Fragment 和 FragmentActivity的使用 http://blog.csdn.net/izy0001989624/article/details/17072211
- Fragment与FragmentActivity通信封装
在项目里面会经常用到Fragment与FragmentActivity,比如Fragment之间的界面切换与Fragment之间的值传递等等,为了方便起见我把Fragment和FragmentActi ...
- 转 Fragment 和 FragmentActivity的使用
今天学习下 Android中的 Fragment 和 FragmentActivity,因为没有4.0手机,平台是2.3.3 所以我是使用 v4 support 包来进行学习. 要想用Fragment ...
- ☆ fragment和fragmentactivity解析 (转)
一.为什么要使用Fragment 1.当我们需要动态的多界面切换的时候,就需要将UI元素和Activity融合成一 个模块.在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单 ...
- Android Fragment和FragmentActivity区别和用法
Android Fragment是Android4.0以上才有的:而FragmentActivity是为了兼容4.0以下版本的Fragment使用的. 所以如果你想兼容4.0以下Android版本使用 ...
- fragment和fragmentactivity解析
一.为什么要使用Fragment 1.当我们须要动态的多界面切换的时候,就须要将UI元素和Activity融合成一个模块.在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个 ...
- Android组件内核之Fragment管理与内核(二)
阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从以下三个内容来介绍Fragment管理与内核: [Fragm ...
随机推荐
- SlimDx绘制点图元的问题
问题:点图元在自己创建的三维环境里渲染不出来,代码如下: GMCustomVertex.PositionNormalColored wellPart = new GMCustomVertex.Posi ...
- Ajax ContentType 列表
".*"="application/octet-stream" ".001"="application/x-001" & ...
- android编程常见问题-程序在模拟器中不显示
新手编程常见问题: 问题表现:程序运行成功,但是在模拟器中不显示 解决办法:检查项目版本和模拟器版本是否匹配或兼容,如果不匹配,选择和模拟器版本一致 项目版本:右键-Properties-androi ...
- Ios8新特性-应用程序扩展
一.什么是应用程序扩展? 应用程序扩展不是一个应用,它是主体应用程序(containing app)中一个单独的包,并能生成单独的二进制文件供其他应用调用. 个人感觉,类似于WP中的启动器,把系统当个 ...
- 【POJ】【2151】Check the difficulty of problems
概率DP kuangbin总结中的第8题 一开始题目看错导致想转移方程想错了……想成f[i][j]表示前 i 个队伍中最多的做出来 j 道题的概率……sigh 看了下题解……其实是对于每个队伍 i 单 ...
- 初识PCA数据降维
PCA要做的事降噪和去冗余,其本质就是对角化协方差矩阵. 一.预备知识 1.1 协方差分析 对于一般的分布,直接代入E(X)之类的就可以计算出来了,但真给你一个具体数值的分布,要计算协方差矩阵,根据这 ...
- 2012 Asia JinHua Regional Contest
Draw Something http://acm.hdu.edu.cn/showproblem.php?pid=4450 o(n)统计输入每个数的平方和. #include<cstdio> ...
- AngularJS 基础
1. AngularJs 是一个JS 框架,是一种基于MVC的设计模式 2. script 需引用 <script src="angular.min.js">,安装包 ...
- matlab字符串操作总结
matlab字符串操作总结 字符串操作总结 char(S1,S2,…)利用给定的字符串或单元数组创建字符数组double(S)将字符串转化成ASC码形式cellstr(S)利用的给定的字符数组创建字符 ...
- 【WCF--初入江湖】08 并发与实例模式
08 并发与实例模式 1. 实例上下文模式 一个服务代理:servicePoxy ChannelFactory<IService1> factoryservicel = new Cha ...