Fragment
Fragment在android3.0版本后才支持,所以需要在android3.0以前版本使用Fragment需要做特殊配置详细方法见后面
fragment在android3.0版本以后的使用方法
fragment 理解成迷你activity,依托于activity存活,如果activity挂了,fragment也挂了。
关键代码
//得到片段的管理器 FragmentManager fm = getFragmentManager(); //利用管理器开启事务 FragmentTransaction ft = fm.beginTransaction(); //在事务中将帧布局用自己创建的Fragment来替换 ft.replace(R.id.fl, new Fragment01()); //将事务提交 ft.commit();
第一步创建一个类来继承Fragment类
public class Fragment01 extends Fragment{
}
第二步重写fragment子类的onCreateView()方法,返回当前fragement显示的view对象。
//返回当前fragement显示的view对象。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//注意,需要自己为fragement01创建一个布局文件
return View.inflate(getActivity(), R.layout.fragement01_layout, null);
}
第三步 在activity中显示fragment
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//得到片段的管理器
FragmentManager fm = getFragmentManager();
//利用管理器开启事务
FragmentTransaction ft = fm.beginTransaction();
//在事务中将帧布局用自己创建的Fragment来替换
ft.replace(R.id.fl, new Fragment01());
//将事务提交
ft.commit();
}
}
Fragment在低版本安卓系统的应用
需要做以下的修改
-
使用 support-v4.jar包。包含有新版本sdk的API。
-
替换所有的导包 android.app.* ---> android.support.v4.app.*;
-
继承activity的时候 换成 FragmentActivity
-
getFragmentManager() --->getSupportFragmentManager();
在实际开发当中,基本上使用的都是v4包里面的fragement
代码参考下面
package a.a.a.a;
import android.os.Bundle;
//第一个需要改动的地方
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.view.View;
//第二个需要改动的地方
public class MainActivity extends FragmentActivity {
private android.support.v4.app.FragmentTransaction ft;
private FragmentManager fm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click1(View v) {
//第三个需要改动的地方
//获取一个Fragment管理者对象
fm = getSupportFragmentManager();
//利用管理者开启一个事务
ft = fm.beginTransaction();
//将MyFragment01替换mainactivity中的fl
ft.replace(R.id.fl, new MyFragment01());
//执行完后将事务提交
ft.commit();
}
}
fragement的生命周期
完整生命周期
oncreate-->oncreateView-->onstart-->onresume-->onpause--->onstop--->ondestroy
可视生命周期
onstart-->onresume-->onpause--->onstop
前台生命周期
onresume-->onpause
通过Fragment传递数据
通过发送广播的方式
在mainactivity中创建一个意图发送广播,在Fragment子类中创建一个广播接收者获取数据
mainactivity中代码
public void click1(View view) {
// 保证界面更新要么成功 要么失败 开启事务
Fragment01 f01 = new Fragment01();
ft = fm.beginTransaction();
ft.replace(R.id.container,f01);
ft.commit();
//提交事务的时候如果还没有提交完就执行下面的子线程,就会导致数据获取不到,所以用子线程晚一点来获取就能得到数据
new Thread(){
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
//发送一个广播 告诉 fragment 数据要变化了。
String name = et_name.getText().toString().trim();
Intent intent = new Intent();
intent.setAction("com.itheima.fragement.change");
intent.putExtra("name", name);
sendBroadcast(intent);
};
}.start();
Fragment01类的代码
public class Fragment01 extends Fragment {
private TextView tv_info;
//返回当前fragement显示的view对象。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
System.out.println("oncreate view");
View view =View.inflate(getActivity(), R.layout.fragement01_layout, null);
tv_info = (TextView) view.findViewById(R.id.tv_info);
System.out.println("tv_info:"+tv_info);
return view;
}
//在执行下面代码的时候 textview的空间还没有被显示到界面上。
public void setName(String name){
tv_info.setText(name);
}
//定义一个广播接收者类
private class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("哈哈哈哈,广播事件到了。");
String name = intent.getStringExtra("name");
setName(name);
}
}
private MyReceiver receiver;
//实现Fragment01的oncreate方法
@Override
public void onCreate(Bundle savedInstanceState) {
System.out.println("oncreate");
receiver = new MyReceiver();
//注册接收广播
getActivity().registerReceiver(receiver, new IntentFilter("com.itheima.fragement.change"));
super.onCreate(savedInstanceState);
}
@Override
public void onDestroy() {
getActivity().unregisterReceiver(receiver);
receiver = null;
System.out.println("ondestory");
super.onDestroy();
}
}