Fragment详解

  • Fragment有自己的生命周期;
  • Fragment依赖于Activity;
  • Fragment通过getActivity()可以获取所在的Activity;Activity通过FragmentManager的findFragmentById()或findFragmentByTag()获取Fragment;
  • Fragment和Activity是多对多的关系。

(1)fragment_a.xml

 

 

 

(2)AFragment.java

 (3)Activity_main.xml_点击更换Fragment时,实例化AFragment填充至R.id.fl_container

 

  

(4) ContainerActivity.java

public class ContainerActivity extends AppCompatActivity{

    private AFragment aFragment;

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

        // 实例化一个Fragment
        aFragment = new AFragment();
        // 把AFragment添加到Activity中,记得调用commit()方法
        // 相比于使用commit方法,使用commitAllowingStateLoss不会出现错误
        getFragmentManager().beginTransaction().add(this.R.fl_container, aFragment).commitAllowingStateLoss(); 
    }
}

(5)点击更换时将AFragment更换为BFragment


        bFragment = new BFragment();
        mButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                getFragmentManager().beginTransaction().replace(R.id.fl_container, bFragment);
            }
        });
    }

Fragment中getActivity()为null的问题?

在使用时,先加入一定的判断,当不为空时,再操作并使用。

如何向Fragment传递参数?

提示:通过构造方法的形式进行传递。但实际:无法重写构造方法,通过静态方法创建实例,并设置Bundle参数来完成参数的传递。

public class AFragment extends Fragment{

    private TextView textView;

    public static AFragment newInstance(String title){
        AFragment fragment =new AFragment();
        Bundle bundle = new Bundle();
        bundle.putString("title", title);
        fragment.setArguments(bundle);
        return fragment;
    }

}
    // 实例化一个Fragment
    aFragment = AFragment.newInstance("我是参数");
    // 把AFragment添加到Activity中,记得调用commit()方法
    // 相比于使用commit方法,使用commitAllowingStateLoss不会出现错误
    getFragmentManager().beginTransaction().add(this.R.fl_container, aFragment).commitAllowingStateLoss(); 

Fragment回退栈 

在AFragment中, 如果不设置,将会直接返回至Activity的页面。值得注意的是,回退至AFragment时,AFragment不会再被实例化一次,但onCreateView()方法会重新再执行一次,也就是视图将会再实例化一次,视图内容将会丢失。

// 在click之前,将当前的aFragmen添加至回退栈中,这样当按返回键的时候就会返回至上一个Fragment
getFragmentManager().beginTransaction().add(this.R.fl_container, bFragment).addToBackStack(null).commitAllowingStateLoss(); 

那如何实现回退时,依旧保持之前的视图数据呢,通过标签+隐藏Fragment的方式实现。

首次添加AFragment时,设置相关标签:

getFragmentManager().beginTransaction().add(this.R.fl_container, aFragment, "a").commitAllowingStateLoss(); 

在替换成BFragment时,先隐藏掉带标签的Fragment.再添加新的Fragment.

Fragment fragment = getFragmentManager().findFragmentById("a");
if(fragment != null){
    getFragmentManager().beginTransaction().hide(fragment).add(R.id.fl_container, bFragment).addToBackStack(null).commitAllowingStateLoss();
}
else{
    getFragmentManager().beginTransaction().add(this.R.fl_container, bFragment).addToBackStack(null).commitAllowingStateLoss(); 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值