fragment的使用(一)

  从google在Android3.0推出fragment之后,fragment的使用场景越来越多。fragment可以将UI界面一块儿一块儿的封装,有更加强大、灵活的生命周期,更快的启动速度。现在越来越多的app,会较少的使用activity,而是用fragment完成大部分页面的展示。

  在这里,我将记录关于fragment的使用方法。

  首先,我们要建立一个大致的结构模型。我们使用Activity作为App的底层界面容器。在Activity中用一个控件,来显示fragment。然后界面的切换就是用这个控件来切换它显示的fragment。

  所以Activity的xml比较简单:

  activity_main.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="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/main_framelayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></FrameLayout>

</LinearLayout>

  将要用来显示fragment的容易就是这个framelayout。

  在开始MainAcitivy.java的代码编写之前,先要在此说明两个类。  

  1.FragmentManager

    它像一个管理fragment的类,它类似一个fragment的容器,能够使用add,remove,findFragmentByTag方法,操作fragment。但是除了findFragmentByTag,我们不能直接操作add和remove,也不能直接操作fragment。我们需要另一个类来进行操作——FragmentTransaction。

  2.FragmentTransaction

    它是一个一次性的事务,我们通过fragmentManager.beginTransaction();获取它,用fragmentTransaction.commit();完成操作。fragmentTransaction提交过一次之后,就不能再提交了。下一次操作时,就要创建新的实例。

  

public class MainActivity extends Activity implements mBaseUiFragment.OnUiFragmentJumpToListener {

    FrameLayout mainFrameLayout;
    FragmentManager fragmentManager;
    Fragment mainFragment;

    Stack<Fragment> mFragmentStack;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainFrameLayout = (FrameLayout) findViewById(R.id.main_framelayout);
        initFragment();

    }

    private void initFragment(){
        fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        mFragmentStack = new Stack<>();

        mainFragment = new MainFragment();
        fragmentTransaction.add(R.id.main_framelayout, mainFragment, MainFragment.FRAGMENT_TAG);
        mFragmentStack.push(mainFragment);

        fragmentTransaction.show(mainFragment);
        fragmentTransaction.commit();
    }}

  mFragmentStack是一个存放fragment的栈。用于模仿activity的堆栈返回机制。

  我们在给fragmentManager中添加fragment时,我们需要设置一个tag.这样,我们想再操作这个fragment时,我们就可以通过findFragmentByTag这个方法,获得这个fragment的引用。

  mBaseUiFragment.OnUiFragmentJumpToListener 是一个接口,用于fragment对activity的回调。这个接口定义在uiFragment的基类中。

  mBaseUiFragment.java:  

public class mBaseUiFragment<T extends mBaseUiFragment> extends mBaseFragment {

    Context mContext;
    View rootView;
    OnUiFragmentJumpToListener onUiFragmentJumpToListener;

    public interface OnUiFragmentJumpToListener{
        void jumpToFragment(Class<? extends Fragment> fragmentClass , String toFragmentTag);
        void fragmentBack();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = getActivity();
        onUiFragmentJumpToListener = (OnUiFragmentJumpToListener) getActivity();
    }
}

   在这个基类中,定义了OnUiFragmentJumpToListener接口,并赋予它实例。OnUiFragmentJumpToListener接口中暂时只声明了跳转和返回的方法。

  因为,我们在MainActivity中可以加上这一段的实现

  MainActivity.java:  

public class MainActivity extends Activity implements mBaseUiFragment.OnUiFragmentJumpToListener {

    FrameLayout mainFrameLayout;
    FragmentManager fragmentManager;
    Fragment mainFragment;

    Stack<Fragment> mFragmentStack;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainFrameLayout = (FrameLayout) findViewById(R.id.main_framelayout);
        initFragment();

    }

    private void initFragment(){
        fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        mFragmentStack = new Stack<>();

        mainFragment = new MainFragment();
        fragmentTransaction.add(R.id.main_framelayout, mainFragment, MainFragment.FRAGMENT_TAG);
        mFragmentStack.push(mainFragment);

        fragmentTransaction.show(mainFragment);
        fragmentTransaction.commit();
    }

    @Override
    public void jumpToFragment(Class<? extends Fragment> fragmentClass , String toFragmentTag) {
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        Fragment targetFragment = fragmentManager.findFragmentByTag(toFragmentTag);

        if (targetFragment == null){
            try {
                targetFragment = fragmentClass.newInstance();
                fragmentTransaction.add(R.id.main_framelayout , targetFragment , toFragmentTag);
                fragmentTransaction.show(fragmentClass.newInstance());
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }else {
            fragmentTransaction.show(targetFragment);
        }

        fragmentTransaction.hide(mFragmentStack.get(0));

        mFragmentStack.push(targetFragment);
        fragmentTransaction.commit();
    }

    @Override
    public void fragmentBack() {
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        Fragment fromFragment = mFragmentStack.pop();
        fragmentTransaction.hide(fromFragment);
        fragmentTransaction.show(mFragmentStack.get(0));
        fragmentTransaction.commit();
    }
}

  

  最后,贴上MainFragment和TestFragment的代码。MainFragment中可以”跳转“至TestFragment,TestFragment可以”返回“。

  MainFragment:

public class MainFragment extends mBaseUiFragment implements View.OnClickListener {

    static public String FRAGMENT_TAG = "MainFragment";

    // View
    TextView downLoadProgress;
    Button startOrPauseBtn;
    Button stopBtn;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.main_layout , null);
        initView();
        return rootView;
    }

    private void initView(){
        downLoadProgress = (TextView) rootView.findViewById(R.id.download_progress_id);
        startOrPauseBtn = (Button) rootView.findViewById(R.id.start_or_pause_btn);
        startOrPauseBtn.setOnClickListener(this);
        stopBtn = (Button) rootView.findViewById(R.id.stop_btn);
        stopBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.start_or_pause_btn:
                onUiFragmentJumpToListener.jumpToFragment(TestFragment.class , TestFragment.FRAGMENT_TAG);
                break;
            case R.id.stop_btn:
                break;
        }
    }
}

  

  TestFragment:

  

public class TestFragment extends mBaseUiFragment {

    static public String FRAGMENT_TAG = "TestFragment";

    Button backBtn;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.test_fragment_layout , null);
        backBtn = (Button) rootView.findViewById(R.id.back_btn);
        backBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onUiFragmentJumpToListener.fragmentBack();
            }
        });
        return rootView;
    }

}

  

  这样就构建起一个基本的以Fragment代替Activity的界面切换的结构。

Done!

时间: 2024-10-20 23:11:35

fragment的使用(一)的相关文章

Android 导航条效果实现(六) TabLayout+ViewPager+Fragment

TabLayout 一.继承结构 public class TabLayout extends HorizontalScrollView java.lang.Object ? android.view.View ? android.view.ViewGroup ? android.widget.FrameLayout ? android.widget.HorizontalScrollView ? android.support.design.widget.TabLayout 二.TabLayou

安卓性能优化之Activity和Fragment通过onSaveInstanceState()保存和恢复数据

Activity和Fragment 都有自己的生命周期,而且很类似.Fragment比Activity多了onAttach()和onCreateView()这些方法.整体它们两者是一样的周期,都会经历从创建视图( onCreate(),onCreateView(),onStart() )到暂停( onPause(), onStop() ) 到重新返回( onResume() ) 到最后销毁( onDetroyView(), onDestroy() ) 这些方法. 之前有提过,熟悉组件的这些生命周

fragment跳转

activity的布局代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match

FragmentTabHost切换Fragment避免重新加载Fragment,即重复调用Fragment的onCreateView

FragmentTabHost一切换再返回的时候Fragment就会调用onCreateView重新绘制页面,被这个问题坑了好久.刚开始也不知道是 FragmentTabHost还是Fragment的原因,网上找了好久也没找到解决办法.终于搜了好久还是找到了: 解决方法,在fragment onCreateView 里缓存View: private View rootView;// 缓存Fragment view @Override public View onCreateView(Layout

Fragment事务管理源码分析

概述 在Fragment使用中,有时候需要对Fragment进行add.remove.show.hide.replace等操作来进行Fragment的显示隐藏等管理,这些管理是通过FragmentTransaction进行事务管理的.事务管理是对于一系列操作进行管理,一个事务包含一个或多个操作命令,是逻辑管理的工作单元.一个事务开始于第一次执行操作语句,结束于Commit.通俗地将,就是把多个操作缓存起来,等调用commit的时候,统一批处理.下面会对Fragmeng的事务管理做一个代码分析 分

仿知乎程序 fragment的切换以及toolbar在不同页面下显示的menu不同

       我们在看知乎的时候,你会发现,首页,发现,关注,收藏,草稿这五项,你在点击之后进入到相应页面之后,侧滑菜单还在,你左侧滑一下,这个侧滑菜单还在,而提问,左滑屏幕,这个页面就没有,有点像返回上一页的感觉. 从操作来看,五页面应该是fragment之间的切换,而提问是单独的activity.     我们先从几个fragment入手,这里我们建立五fragment页,选择继承自android.support.v4.app.Fragment,因为这五个页面基本上都一样,就是简单的一个布局

对fragment的学习

一直对fragment一知半解,今天在运行一个项目的时候,有用到fragment,所以好好地复习了下fragment的知识: 1.fragment的生命周期: 2.在一个访问fragment中的资源可以在 public void onActivityCreated(Bundle savedInstanceState){}方法中 3. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle save

Android Acitivity 与 Fragment 声明周期

Activity的生命周期: (1)启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态. (2)当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行. Activity -> onFreeze() -> onPause() (3)当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态. (4)当前

Android - Fragment (三)不同Fragment之间的通信

在Fragment的java文件中,可以使用getActivity()来获得调用它的activity, 然后再找到另一个Fragment,进行通信 getActivity().getFragmentManager().findFragmentById(R.id.fragment_list); 但这样做耦合度太高,不方便后续的修改操作 Fragment与其附着的Activity之间的通信,都应该由Activity来完成 不能是多个Fragment之间直接通信 Fragment与其附着的Activi

Android Fragment 真正的完全解析(上)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37970961 自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fragment谈上关系,做什么都要问下Fragment能实现不~~~哈哈,是不是有点过~~~ 本篇博客力求为大家说明Fragment如何产生,什么是Fragment,Fragment生命周期,如何静态和动态的使用Fragment,Fragment回退栈,Fragment事务:以及Fragment的一些特