【android学习】Fragment

来源:互联网 发布:淘宝子账号登录密码 编辑:程序博客网 时间:2024/06/06 02:15

1,概念

1)认识

fragment是activity的一个界面或一个组成部分,一个activity可以由多个fragment组成,每个Fragment有自己的生命周期、可接收和处理用户事件,避免了activity有太多繁重的代码。
另外,可以根据用户的不同,动态的添加、替换和移除某个fragment。

2)生命周期

fragment生命周期

①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
fragment

②代码

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)

原创粉丝点击