Fragment的简单使用
静态加载
如果要弄一个微信对话框,则可以分成标题栏和对话栏两个Fragment
所以staticfragment_layout有两个
每个都需要有一个name属性,这个属性值为一个 Fragment类或者它的子类
在这个子类中,需要重写 ==onCreateView== 方法,这个方法的任务就是把 这个fragment对应的布局文件变成view返回回去。
//将布局文件转化为view View view=inflater.inflate(R.layout.simplefragment2_layout,container,false); return view;
要注意的是,因为主布局文件拥有fragment,所以其实主布局文件也拥有fragment的控件,并且可以直接findviewbyid,而在fragment类中就要view.findviewbyid
所以Fragment静态加载就是加布局文件中有fragment,然后每个fragment有对应的id和name,然后每个fragment类又重写onCreateView然后返回view。
动态加载
动态加载其实就是不在布局文件中用 节点来布置,而是通过代码。
动态加载要点就是把fragment类去代替原有布局中的一些layout,或者是替换原本的。可以增删改查,所以灵活性更强。
代码如下:
SimpleFragment1 sf1=new SimpleFragment1(); //声明一个fragment类 FragmentManager manager=getFragmentManager(); //创建一个fragment管理者 FragmentTransaction beginTransaction=manager.beginTransaction(); //创建一个fragment事务 beginTransaction.add(R.id.frame,sf1); //事务可以通过增删改查来代替不同layout或 fragment,add是增加,意思是在frame剩余的地方加入 beginTransaction.addToBackStack(null); //设置按返回键就可以退回刚才的操作 beginTransaction.commit(); //事务只有commit提交了,才能是真正进行操作 //然后操作就搞定了,然后会将fragment去填充layout或者fragment
Activity动态加载Fragment的同时,向Fragment发送信息
信息传递的载体是 Bundle, 可以通过Bundle的put方法传递一些基本类型,也可以传递 Serizable接口
Stringi info="zst"; Bundel bundle=new Bundle(); bundle.putString("name",info);
而fragment类是有一个 fragment.setArgument(Bundle) 的参数,然后把bundle传递进去即可。
然后就像动态加载那样
SimpleFragment2 sf2=new SimpleFragment2(); sf2.setArguments(bundle); //这样fragment就带有了bundle的数据 //所以要在simpleFragment2那里处理消息。 FragmentManager manager=getFragmentManager(); FragmentTransaction beginTransaction=manager.beginTransaction(); beginTransaction.add(R.id.astif_layout,sf2,"SimpleFragment2"); //这样为fragment添加tag,那又有什么用? beginTransaction.addToBackStack(null); beginTransaction.commit();
同时,在Fragment类中,也要处理接收信息。
Bundle bundle=getArguments(); //fragment自带getArgument函数 if(bundle!=null) { //如果fragment带有参数 String InfoFromActivity = (String) bundle.get("name"); textView = (TextView) view.findViewById(R.id.sf2_textview); textView.setText("我的名字是:" + InfoFromActivity); }
Activity静态加载Fragment并传递信息
静态加载传递信息就比较简单了,我们可以直接把 fragment 实例化拿出来,直接操作即可
FragmentManager manager=getFragmentManager(); Fragment fragment=manager.findFragmentById(R.id.sf1); SimpleFragment sf1=(SimpleFragment)fragment; //然后就把 SimpleFragment拿到手,想怎样传递数据都行。(通过setter,getter)
Fragment向Activity传递信息
这个所谓的传递信息,也就是把在Fragment类中,把所在的Activity拿到手,然后对Activity进行接口化,就可以实现多态了。
//首先要将Activity接口化 public interface ConverInfo{ public void getInfo(String info); } //在Fragment类中 @Override public void onAttach(Activity activity){ ConverInfo listener=(ConverInfo)activity; super.onAttach(activity); } //这样就算传递信息了... 因为在Activity中已经有这个字符串了 ConverInfo.getInfo("I love zst"); //在Activity中 @Override public void getInfo(String info){ Toast.makeText(this,"I have get the infomation: "+info,Toast.xxx).show(); }
如果是静态的也差不多,因为静态的话,Activity简直就有Fragment的实例,所以直接获取即可。