静态加载Fragment
步骤;
1、新建一个Fragment1类继承Fragment
2、在所要加载Fragment的Activity的布局中添加<fragment/>标签,android:name=”Fragment1的命名空间“
<fragment
android:id="@+id/fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.fragment.fragment_static"
/>
相关视频教程:http://www.imooc.com/video/2417 http://www.imooc.com/video/2418
动态加载Fragment
步骤:
1、同静态1步骤
2、在Activity中采用碎片管理者的事务处理
a) 获取碎片管理者
b) 由碎片管理者开始事务
c) 把所要加载的碎片添加到事务
d) 提交事务
相关代码:
Fragment1 fragment1 = new Fragment1();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
beginTransaction.add(R.id.frame, fragment1); //frame为fragment1的父布局
beginTransaction.addToBackStack(null); //处理物理返回键
beginTransaction.commit();
相关视频教程:http://www.imooc.com/video/2419
Fragment的生命周期
/*
* 当Fragment被添加到Activity中时会调用,并且只调用一次
*/
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
Log.i("Main", "Fragment2---onAttach()");
}
/*
* 当创建Fragment时被调用,只会调用一次
*/
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.i("Main", "Fragment2---onCreate()");
}
/*
* 当Fragment所在的Activity启动完成以后调用
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
Log.i("Main", "Fragment2---onActivityCreated()");
}
/**
* 启动Fragment时回调
*/
@Override
public void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.i("Main", "Fragment2---onStart()");
}
/**
* 回复Fragment时回调次方法,调用onStart()方法后一定会调用此方法。
* (Fragment获取焦点时调用)
*/
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.i("Main", "Fragment2---onResume()");
}
/**
* 暂停Fragment时回调
*/
@Override
public void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.i("Main", "Fragment2---onPause()");
}
/**
* 停止Fragment时回调
*/
@Override
public void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.i("Main", "Fragment2---onStop()");
}
/**
* 销毁Fragment所包含的View组件时回调
*/
@Override
public void onDestroyView() {
// TODO Auto-generated method stub
super.onDestroyView();
Log.i("Main", "Fragment2---onDestroyView()");
}
/**
* 销毁Fragment时会被回调
*/
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i("Main", "Fragment2---onDestroy()");
}
/**
* 把Fragment从Activity中删除时会被回调
*/
@Override
public void onDetach() {
// TODO Auto-generated method stub
super.onDetach();
Log.i("Main", "Fragment2---onDetach()");
}
Fragment和Activity的通信
1、Activity--〉Fragment
Activity向静态加载的Fragment发送数据
a) 在所要通信的Fragment中设置一个消息变量,并生成get(),set()方法
b) 在Activity中通过FragmentManager的findViewById方法找到所要通信的布局,并通过set()方法传递数据
c) 在Fragment的get()方法即可接收此值。
关键代码:
/**
* 对静态Fragment,由Activity向Fragment传值的方法
* 1、获取碎片管理者对象 FragmentManager(getFragmentManager())
* 2、通过调用碎片管理者的findFragmentById(静态碎片的id)方法找到通信的碎片
* 3、转换成你定义的碎片
* 4、调用碎片中的方法传递你的数据
*/
FragmentManager fragmentManager = getFragmentManager();
Fragment findFragmentById = fragmentManager.findFragmentById(
R.id.myFragment);
fragment_static myFragment = (fragment_static) findFragmentById;
myFragment.setSendText("Activity向Fragment发送数据");
Activity向动态加载的Fragment发送数据
/**
* 动态加载Fragment并向Fragment传递数据
* 利用bundle数据类型进行传值,
* 1.新建Bundle数据类型,添加所要传送的数据,创建键值对
* Bundle bundle = new Bundle();
* bundle.putString("name", text);
* 2.利用Fragment的setArguments(Bundle bundle);进行对碎片传值
* fragment4.setArguments(bundle);
3.在Fragment中通过getArguments().get("name")得到Actiity中传来的值
*/
相关代码:
Activity中:
String text = editText.getText().toString();
Fragment4 fragment4 = new Fragment4();
Bundle bundle = new Bundle();
bundle.putString("name", text);
fragment4.setArguments(bundle);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction beginTransaction = fragmentManager
.beginTransaction();
/**
* 下面add()方法中的第三个参数指的是要加载的碎片的tag(标识),
* add()方法是把当前碎片直接加入到事务队列中,不管有没有同一标识的碎片,
* 碎片中组件加载时总加载最上面的那个。
* replace()方法是:若事务中原先有该碎片的话,先删除该碎片,然后再把当前的
* 碎片加入到此事务中。用新的同一标识的碎片替换原来的碎片。
*/
//fragmentTransaction.add(R.id.layout1,fragment4,"fragment4");
beginTransaction.replace(R.id.layout1,fragment4,"fragment4");
beginTransaction.addToBackStack(null);
beginTransaction.commit();
Toast.makeText(MainActivity4.this, "向Fragment发送数据" + text,
Toast.LENGTH_SHORT).show();
Fragment中:
String tv = getArguments().get("name")+"";
2、Fragment向Activity传值
a) 在Fragment中自定义一个接口,在接口中写入传递信息的方法
b) 在Activity中调用该接口并实现该方法 ,该方法中便可以接收Fragment传来的值
c) 在Fragment中同过getActivity()得到所在的Actiity,并调用getActivity()的实现的接口的方法,实现传值。
代码:
Fragment中:
private Listener listener;
public interface Listener{
public void thanks(String text);
}
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
listener = (Listener)activity;
}
listener.thanks(thanksText);
Activity中:
implements Listener
@Override
public void thanks(String str) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity4.this, "收到"+str, Toast.LENGTH_SHORT)
.show();
}
相关视频: http://www.imooc.com/video/2504