Android Fragment 笔记

1 定义Fragment:

1 继承Fragment
package com.example.testproject;
import android.app.Fragment;
public class MyFragment extends Fragment {}
2 继承V4包里的Fragment
package com.example.testproject;
import android.support.v4.app.Fragment;
public class MyFragment extends Fragment {}

两个方法大同小异,无非是APIlevel的问题,如果需要兼容4.0以下的机器,就需要继承自V4包。

2 Fragment的布局和操作

fragment实现自己的布局,要重写onCreateView这个函数

private int layoutRes; //和activity一样的布局文件
private View parentView; //通过这个parentView来管理layout文件中声明的控件
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    parentView = inflater.inflate(layoutRes, container, false);
    return parentView;
}

activity有finish()方法结束掉自己,fragment中也有类似的方法:

getActivity().getSupportFragmentManager().popBackStack();
//popStack操作也就是弹栈,即模拟返回键的操作

3 加载Fragment:

1 静态加载

在布局文件中当成自定义控件一样声明

<RelativeLayout 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"
    tools:context=".MainActivity" >

    <com.example.testproject.MyFragment
        android:id="@+id/mFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        ></com.example.testproject.MyFragment>

</RelativeLayout>

在activity中获取这个fragment:

MyFragment myFragment = (MyFragment)getFragmentManager().findFragmentById(R.id.mFragment);

如果是使用V4包,则activity要继承自FragmentActivity,来获取一些操作Fragment的方法

public class MainActivity extends FragmentActivity

然后再:

MyFragment myFragment = (MyFragment)getSupportFragmentManager().findFragmentById(R.id.mFragment);
2 动态加载

动态加载相对复杂,但是也更加灵活,首先在布局文件里,为fragment的容器添加一个ID:

<RelativeLayout 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:id="@+id/container"
    tools:context=".MainActivity" >

</RelativeLayout>

再在activity中使用:

// 首先获取manager,这个变量在fragment的设计中应该是一个单例,将它写成全局变量比较方便
FragmentManager manager = getFragmentManager();
// 开启事务,这个transition不能重复使用,建议作为局部变量
FragmentTransaction transaction = manager.beginTransaction();
// 第一个参数是布局文件中,fragment容器的ID,第二个参数是Fragment的实例
// 这个"MY"可以在fragment.getTag()的方法中获取到,起到标识的作用
// add方法的重载有很多,可以把TAG替换成ID
// add方法之外还有replace,remove,hide,show等方法。
transaction.add(R.id.container, new MyFragment(), "MY");
// 提交事务
transaction.commit();

如果是V4包,则这样子获取manager

FragmentManager manager = getSupportFragmentManager();

在原来代码的基础上再次添加一个fragment:

// 开启事务,这个transition不能重复使用,建议作为局部变量
FragmentTransaction transaction = manager.beginTransaction();
// 第一个参数是布局文件中,fragment容器的ID,第二个参数是Fragment的实例
// 这个"MY"可以在fragment.getTag()的方法中获取到,起到标识的作用
// add方法的重载有很多,可以把TAG替换成ID
// add方法之外还有replace,remove,hide,show等方法。
transaction.add(R.id.container, new MyFragment(), "SECOND");
// 将当前也就是第一个fragment添加到Stack中保存起来,
// 在添加第二个fragment之后,按返回键执行popstack操作的时候,会显示第一个fragment
transaction.addToBackStack(null);
// 提交事务,不提交不起作用
transaction.commit();

4 在activity中管理Fragment:

fragment在activity中是以stack的形式存放,

这里可以添加一个监听器,当Stack的状态发生变化
(比如添加一个fragment,remove掉一个fragment之类的操作),都会响应CAllBACK函数

public class MainActivity extends Activity implements OnBackStackChangedListener

getSupportFragmentManager().addOnBackStackChangedListener(MainActivity.this);

@Override
public void onBackStackChanged() {
    do something;
}

获取Stack中所有fragment

List<Fragment> fragments = manager.getFragments();

根据TAG获取fragment

MyFragment fragmentByTag = (MyFragment) manager.findFragmentByTag("SECOND");

注意:一个Fragment执行popStack操作以后,fragments的size不会变化,这时候如果调用fragmes.get(index)方法,会报空指针错误,所以一定要先判断 fragment != null才能继续操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值