【android学习】Fragment
来源:互联网 发布:淘宝子账号登录密码 编辑:程序博客网 时间:2024/06/06 02:15
1,概念
1)认识
fragment是activity的一个界面或一个组成部分,一个activity可以由多个fragment组成,每个Fragment有自己的生命周期、可接收和处理用户事件,避免了activity有太多繁重的代码。
另外,可以根据用户的不同,动态的添加、替换和移除某个fragment。
2)生命周期
①onAttach(Activity)
当Fragment与Activity发生关联时调用。
②onCreateView(LayoutInflater, ViewGroup,Bundle)
创建该Fragment的视图
③onActivityCreated(Bundle)
当Activity的onCreate方法返回时调用
④onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用
⑤onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用
注意
除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现。
3)Fragment常用API
①android.app.Fragment
这个类用于定义Fragment
②android.app.FragmentManager
主要用于在Activity中操作Fragment。
getFragmentManager() //获取FragmentManage的方式
③android.app.FragmentTransaction
保证一些Fragment操作的原子性。
FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务transaction.add() //往Activity中添加一个Fragmenttransaction.remove() //从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。transaction.replace() //使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~transaction.hide() //隐藏当前的Fragment,仅仅是设为不可见,并不会销毁transaction.show() //显示之前隐藏的Fragmentdetach() //会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护attach() //重建view视图,附加到UI上并显示。transatcion.commit()//提交一个事务(commit方法一定要在Activity.onSaveInstance()之前调用)
2,demo
1)用TextView实现的底部菜单,以及Fragment的应用
点击下载demo
①总体概述
首先,MainActivity.Java 继承FragmentActivity。
每个底部菜单按钮对应一个Fragment.
黑色的框是用来切换Fragment.橘色的框是底部菜单,有3个按钮。
这个底部菜单的布局,是外面套一个LinerLayout,里面3个TextView。通过设置权值让3个按钮宽度一样,TextView可以同时设置DrawableTop属性和Text属性。
另外,底部菜单还可以通过其他方式实现。比如用RadioButton,TabHost
②代码
common_bottom_bar.xml代码:
<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="@dimen/bottom_bar_height" android:layout_gravity="bottom" android:background="@color/dark_white" android:baselineAligned="false" android:gravity="center" > <!-- 主页 --> <TextView android:id="@+id/com_bottom_bar_tv_home" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_gravity="center" android:layout_weight="1" android:clickable="true" android:drawableTop="@drawable/icon_home" android:gravity="center" android:paddingBottom="5dip" android:paddingTop="10dip" android:text="@string/com_bottom_bar_home" android:textColor="#1B940A" android:textStyle="bold" /> <!-- 微淘 --> <TextView android:id="@+id/com_bottom_bar_tv_MicroAmoy" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:clickable="true" android:drawableTop="@drawable/icon_home" android:gravity="center" android:paddingBottom="5dip" android:paddingTop="10dip" android:text="@string/com_bottom_bar_MicroAmoy" android:textColor="#1B940A" android:textStyle="bold" /> <!-- 社区 --> <TextView android:id="@+id/com_bottom_bar_tv_community" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:clickable="true" android:drawableTop="@drawable/icon_home" android:gravity="center" android:paddingBottom="5dip" android:paddingTop="10dip" android:text="@string/com_bottom_bar_community" android:textColor="#1B940A" android:textStyle="bold" /> <!-- 购物车 --> <TextView android:id="@+id/com_bottom_bar_tv_shoppingTrolley" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:clickable="true" android:drawableTop="@drawable/icon_home" android:gravity="center" android:paddingBottom="5dip" android:paddingTop="10dip" android:text="@string/com_bottom_bar_shoppingTrolley" android:textColor="#1B940A" android:textStyle="bold" /> <!-- 我的淘宝 --> <TextView android:id="@+id/com_bottom_bar_tv_myTaobao" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:clickable="true" android:drawableTop="@drawable/icon_home" android:gravity="center" android:paddingBottom="5dip" android:paddingTop="10dip" android:text="@string/com_bottom_bar_myTaobao" android:textColor="#1B940A" android:textStyle="bold" /> </LinearLayout>
common_bottom_bar.xml代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <com.luo.view.TitleBarView android:id="@+id/act_main_titleBar" android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1" android:gravity="top" /> <ScrollView android:id="@+id/act_main_scrollView" android:layout_width="fill_parent" android:gravity="center" android:layout_height="0dip" android:layout_weight="8" > <LinearLayout android:id="@+id/act_main_ll_content" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> </LinearLayout> </ScrollView> <LinearLayout android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:gravity="bottom" > <include layout="@layout/common_bottom_bar" /> </LinearLayout> </LinearLayout>
MainActivity.java中,实现跳转部分的代码:
private FragmentManager fm = getSupportFragmentManager(); private Fragment_home fra_home = Fragment_home.getInstance(); private Fragment_MicroAmoy fra_MicroAmoy = Fragment_MicroAmoy.getInstance(); private Fragment_community fra_community = Fragment_community.getInstance(); private Fragment_shoppingTrolley fra_shoppingTrolley = Fragment_shoppingTrolley.getInstance(); private Fragment_myTaobao fra_myTaobao = Fragment_myTaobao.getInstance(); private void gotoHome() { FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.act_main_ll_content, fra_home, MainActivity.TAG); ft.commit(); setButton(tv_home); }
private void setButton(TextView v) { setDrawableTop(v, R.drawable.icon_home); setBackground(v, R.color.dark_orange); v.setEnabled(false); switch (v.getId()) { case R.id.com_bottom_bar_tv_home: setBackground(tv_MicroAmoy, R.color.dark_white); setBackground(tv_community, R.color.dark_white); setBackground(tv_shoppingTrolley, R.color.dark_white); setBackground(tv_myTaobao, R.color.dark_white); tv_MicroAmoy.setEnabled(true); tv_community.setEnabled(true); tv_shoppingTrolley.setEnabled(true); tv_myTaobao.setEnabled(true); break; case R.id.com_bottom_bar_tv_MicroAmoy:
/** * 设置textView顶部图片 * @param tv 要设置的TextView * @param id_drawable 要设置的图片 */ private void setDrawableTop(TextView tv, int id_drawable){ Drawable topDrawable = getResources().getDrawable(id_drawable); topDrawable.setBounds(0, 0, topDrawable.getMinimumWidth(), topDrawable.getMinimumHeight()); //void android.widget.TextView.setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom) tv.setCompoundDrawables(null, topDrawable, null, null); } /** * 设置textView背景 * @param tv 要设置的TextView * @param id_color 要设置的颜色 */ private void setBackground(TextView tv, int id_color){ int color = getResources().getColor(id_color); tv.setBackgroundColor(color); }
Fragment_home.java:
package com.luo.fragment; import com.example.layout_demo.R; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class Fragment_home extends Fragment { private Context mContext; private View mBaseView; private static Fragment_home instance = new Fragment_home(); public static Fragment_home getInstance() { return instance; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContext = getActivity(); mBaseView = inflater.inflate(R.layout.fragment_home, container, false); findView(); init(); return mBaseView; } private void findView() { } private void init() { } }
2)ViewPager实现fragment的切换
点击下载demo
①技术要点
ViewPager。
用 ArrayList fragmentList存储fragment。
用xml中的selector来切换图片。
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_enabled="false" android:drawable="@drawable/icon_selected"/> <item android:state_pressed="true" android:drawable="@drawable/icon_selected"/> <item android:drawable="@drawable/icon"/></selector>
②优点
此方法可以根据用户的不同,动态的添加、替换和移除某个fragment。
③关键部分代码
package com.luo.activity;import java.util.ArrayList;import com.example.layout_demo.R;import com.luo.adapter.Adapter_FragmentPager;import com.luo.fragment.Fragment_MicroAmoy;import com.luo.fragment.Fragment_home;import com.luo.fragment.Fragment_myTaobao;import android.annotation.SuppressLint;import android.os.Bundle;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.support.v4.view.ViewPager.PageTransformer;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.view.View;import android.view.View.OnClickListener;import android.widget.TextView;public class MainActivity extends FragmentActivity { protected static final String TAG = "MainActivity"; // 底部菜单 private TextView tv_home, tv_MicroAmoy, tv_myTaobao; private ViewPager main_viewPager;//容纳fragment private ArrayList<Fragment> fragmentList; private static int current = 0;//当前底部菜单索引 private static View currentView;//记录当前是哪个底部菜单 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findView(); InitViewPager(); } private void findView() { tv_home = (TextView) findViewById(R.id.com_bottom_bar_tv_home); tv_MicroAmoy = (TextView) findViewById(R.id.com_bottom_bar_tv_MicroAmoy); tv_myTaobao = (TextView) findViewById(R.id.com_bottom_bar_tv_myTaobao); tv_home.setOnClickListener(new clickListener()); tv_MicroAmoy.setOnClickListener(new clickListener()); tv_myTaobao.setOnClickListener(new clickListener()); } private void InitViewPager(){ main_viewPager = (ViewPager) findViewById(R.id.main_ViewPager); fragmentList = new ArrayList<Fragment>(); fragmentList.add(Fragment_home.getInstance()); fragmentList.add(Fragment_MicroAmoy.getInstance()); fragmentList.add(Fragment_myTaobao.getInstance()); main_viewPager.setAdapter(new Adapter_FragmentPager(getSupportFragmentManager(), fragmentList)); main_viewPager.setCurrentItem(current); if(null==currentView){ //第一次进入 setButton(tv_home); }else{ setButton(currentView); } main_viewPager.setOnPageChangeListener(new PageChangeListener()); main_viewPager.setPageTransformer(true, new DepthPageTransformer()); } /** * 解决滑动mapview所在的viewpage闪黑问题 */ public class DepthPageTransformer implements PageTransformer { private static final float MIN_SCALE = 0.75f; public void transformPage(View view, float position) { int pageWidth = view.getWidth(); if (position < -1) { // [-Infinity,-1) // This page is way off-screen to the left. view.setAlpha(0); } else if (position <= 0) { // [-1,0] // Use the default slide transition when moving to the left page view.setAlpha(1); view.setTranslationX(0); view.setScaleX(1); view.setScaleY(1); } else if (position <= 1) { // (0,1] // Fade the page out. view.setAlpha(1 - position); // Counteract the default slide transition view.setTranslationX(pageWidth * -position); // Scale the page down (between MIN_SCALE and 1) float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position)); view.setScaleX(scaleFactor); view.setScaleY(scaleFactor); } else { // (1,+Infinity] // This page is way off-screen to the right. view.setAlpha(0); } } } public class PageChangeListener implements OnPageChangeListener { @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @SuppressLint("ResourceAsColor") @Override public void onPageSelected(int arg0) { int current = main_viewPager.getCurrentItem(); switch (current) { case 0://主页 setButton(tv_home); break; case 1://微淘 setButton(tv_MicroAmoy); break; case 2://我的淘宝 setButton(tv_myTaobao); break; } } } private class clickListener implements OnClickListener { @Override public void onClick(View v) { switch (v.getId()) { case R.id.com_bottom_bar_tv_home: current = 0; break; case R.id.com_bottom_bar_tv_MicroAmoy: current = 1; break; case R.id.com_bottom_bar_tv_myTaobao: current = 2; break; default: break; } setcurrentitem(); } } /** * 切换fragement */ private void setcurrentitem() { if (main_viewPager.getCurrentItem() != current) { main_viewPager.setCurrentItem(current); } } private void setButton(View v) { if (null == v) { return; } if(currentView!=null && currentView.getId() != v.getId()){ currentView.setEnabled(true); } v.setEnabled(false); currentView = v; } @Override protected void onDestroy() { super.onDestroy(); currentView = null; current = 0; }}
package com.luo.adapter;import java.util.ArrayList;import java.util.Iterator;import java.util.Set;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentPagerAdapter;public class Adapter_FragmentPager extends FragmentPagerAdapter { private ArrayList<Fragment> list; public Adapter_FragmentPager(FragmentManager fm, ArrayList<Fragment> list) { super(fm); this.list = list; } @Override public Fragment getItem(int arg0) { return list.get(arg0); } @Override public int getCount() { return list.size(); }}
package com.luo.fragment;import com.example.layout_demo.R;import android.content.Context;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public class Fragment_home extends Fragment { private Context mContext; private View mBaseView; private static Fragment_home instance = new Fragment_home(); public static Fragment_home getInstance() { return instance; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContext = getActivity(); mBaseView = inflater.inflate(R.layout.fragment_home, container, false); findView(); init(); return mBaseView; } private void findView() { } private void init() { }}
3)
- Android Fragment学习笔记
- android fragment学习笔记
- android Fragment demo学习
- android Fragment demo学习
- Android学习之 Fragment
- android学习Fragment小计
- 学习笔记 android fragment
- android Fragment 学习笔记
- Android Fragment 学习<1>
- android Fragment学习
- Android Fragment组件学习
- Android学习笔记 - fragment
- Android Fragment学习总结
- Android Fragment学习
- android fragment学习总结
- android学习-----Fragment
- Android Fragment 组件学习
- Android学习--viewpager+ Fragment
- 10表格元素上
- ros源码分析(3)—rosmaster 包分析
- @JoinColumn
- Intellij Idea 15 下新建 Hibernate 项目以及如何添加配置
- Android避免进入一页面后EditText自动弹出软键盘
- 【android学习】Fragment
- select 语句查询
- 安卓——WIFI连接
- Android 把bitmap图片的某一部分的颜色改成其他颜色
- 算法总览
- 9列表
- tensorflow1.1/variational_autoencoder
- 11.2 rac psu 补丁
- 使用source命令向MySQL导入超大文件