Fragment使用(一)

一 首先是引用包的问题

Fragment是Android 3.0出现的,旧版本要兼容使用Fragment必须引入包android-support-v4.jar,可以兼容到1.6。

它们的区别:

1.在创建FragmentTransaction实例时: 

  如果import android.app.Fragment;使用的是FragmentManager fragmentManager = getFragmentManager()

  如果import android.support.v4.app.FragmentManager;那么使用的是:FragmentManager fragmentManager = getSupportFragmentManager();

2.它们都可以使用<fragment>标签。

  如果import android.app.Fragment;加入Fragment布局的Activity继承Activity。

  如果import android.support.v4.app.FragmentManager;加入Fragment布局的Activity继承FragmentActivity。

  否则报异常。android.app.Fragment$InstantiationException:Trying to instantiate a class XXX  is not a fragment。或者抛出android.view.InflateException: Binary XML file line #7: Error inflating class fragment异常。

3.两者不能一起用。

二开始使用Fragment。

Fragment主要有两种加载方式,两种加载方式可以同时用。

1 静态添加Fragment,即通过某Activity的布局文件将Fragment加入该Activity。

  1)在layout文件夹定义example_fragment.xml作为Fragment的布局文件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
     <TextView
        android:id="@+id/staticfragment_text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="这是一个静态添加的Fragment"
        android:textColor="#000000"
        android:textSize="25sp" /> 

</LinearLayout>

  2)定义ExampleFragment.java继承Fragment,在onCreateView方法中设置以R.layout.example_fragment作为资源的布局。

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ExampleFragment extends Fragment {
    private String TAG = "ExampleFragment";
    /******************当被创建时经历的状态,对应Activity的Created********************/
    @Override
    public void onAttach(Activity activity) {
        Log.d(TAG, "onAttach");
        super.onAttach(activity);
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {//必须实现的回调函数。只被调一次,用这里应该初始化相关的组件,一些即便是被暂停或者被停止时依然需要保留的东西。
        Log.d(TAG, "onCreate");
        super.onCreate(savedInstanceState);
    }
    /*****************当对用户可见时*****************/
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,//必须实现的回调函数。当每次可见时系统调用这个方法,必须返回一个View,如果Fragment不提供UI也可以返回null。
            Bundle savedInstanceState) {//container参数代表该Fragment在Activity中的父控件;savedInstanceState提供了上一个实例的数据。
        Log.d(TAG, "onCreateView");
        View view = inflater.inflate(R.layout.example_fragment,container, false);//第一个是resource ID,指明了当前的Fragment对应的资源文件;第二个参数是父容器控件;第三个布尔值参数表明是否连接该布局和其父容器控件,在这里的情况设置为false,因为系统已经插入了这个布局到父控件,设置为true将会产生多余的一个View Group。
        return view;
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        Log.d(TAG, "onActivityCreated");
        super.onActivityCreated(savedInstanceState);
    }
    /**********************************/
    //对应Activity的Started
    @Override
    public void onStart() {
        Log.d(TAG, "onStart");
        super.onStart();
    }
    //对应Activity的Resumed状态
    @Override
    public void onResume() {
        Log.d(TAG, "onResume");
        super.onResume();
    }
    /*****************当进入后台模式,不可见*****************/
    //Paused
    @Override
    public void onPause() {//必须实现的回调函数。当用户离开Fragment时第一个调用这个方法,需要提交一些变化,因为用户很可能不再返回来。
        Log.d(TAG, "onPause");
        super.onPause();
    }
    @Override
    public void onSaveInstanceState(Bundle outState) {
        Log.d(TAG, "onSaveInstanceState");
        super.onSaveInstanceState(outState);
    }
    //Stopped
    @Override
    public void onStop() {
        Log.d(TAG, "onStop");
        super.onStop();
    }
    /*****************对应Destroyed状态*****************/
    @Override
    public void onDestroyView() {
        Log.d(TAG, "onDestroyView");
        super.onDestroyView();
    }
    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy");
        super.onDestroy();
    }
    @Override
    public void onDetach() {
        Log.d(TAG, "onDetach");
        super.onDetach();
    }

}

  3)在main.xml文件中定义<fragment>标签,标签name为自己定义的ExampleFragment.java的完整的类名。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:id="@+id/main_linearlayout"
     >
      <!-- android:name属性填上你自己创建的fragment的完整类名。 -->
    <fragment  android:name="com.example.ExampleFragment"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" />
</LinearLayout> 

  4)在MainActivity设置main.xml布局,启动看看吧。

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

}

2 动态添加Fragment,即通过编程的方式将Fragment加入到一个ViewGroup中。前两步同上,不贴代码了。

  1)在layout文件夹定义example_fragment.xml作为Fragment的布局文件。

  2)定义ExampleFragment.java继承Fragment,在onCreateView方法中设置以R.layout.example_fragment作为资源的布局。

  3)在main.xml文件中定义一个<LinearLayout>或者其他的布局,用来做为动态生成的Fragment的父容器,id设置一个值”dynimic_layout“做为父容器的id。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:id="@+id/main_linearlayout"
     >
     <LinearLayout
        android:id="@+id/dynimic_layout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        /> 

</LinearLayout> 

  4)在MainActivity中使用FragmentTransaction的add()方法添加Fragment。over。

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //动态添加Fragment
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        DynamicFragment fragment = new DynamicFragment();
        fragmentTransaction.add(R.id.dynimic_layout, fragment);
        fragmentTransaction.commit();
    }

}

时间: 2024-12-28 08:09:59

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的一些特