Fragment
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(); } }