fragment 布局的使用

android

2013-11-30 11:19

1。

简单的使用方法。在主布局加入2个fragment 布局

  <fragment 

 android:id="@+id/f1"

 android:name="com.example.fragment.f1"       //继承Fragment 的之类

 android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_weight="1"

 />

 <fragment 

 android:id="@+id/f2"

 android:name="com.example.fragment.f2"

 android:layout_width="match_parent"

 android:layout_height="match_parent"

 android:layout_weight="1"

  />



public class f1 extends Fragment {

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

return  inflater.inflate(R.layout.f1, null);  //填充布局

}





}

f2同上



2.

动态加载 Fragment  

先在Activity写入

Fragment f1= new f1();

FragmentManager fm =getFragmentManager();  //获取管理器



FragmentTransaction ft =fm.beginTransaction(); //事务性质



ft.add(R.id.l1, f1);                           //增加  放入的布局的ID 后是f1的类




ft.commit();                                   //提交


生命周期

开始前先执行   Fragment的然后在执行Fragment的    销毁是 先销毁Fragment在Fragment的顺序

Fragment的 onCreate只会执行一次  适合初始化变量  


3.   不同Fragment 获取数据

创建的时候 add(R.id.l1, f1,"标识");    先加入标识

Fragment Fragment =(Fragment)getFragmentManager().findFragmentByTag("标识");  //获取管理器里的标识


Fragment.getView().findViewById(R.id.button1);               //然后取得布局。。就可以去对应的值了。


4 让Fragment  支持回退操作

创建的时候 add(R.id.l1, f1,"标识");    先加入标识

ft.addToBackStack(“标识”);          设置当前按返回键 回退到什么Fragment    不加 点返回键就退出了哦。。

5.

利用ListFragment 实现动态列表

首先创建类  继承ListFragment 


public class listf extends ListFragment {

    public ArrayList<String> lists;

    private ArrayAdapter<String> ad;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

     lists=new ArrayList<String>();

     for(int i=0;i<=10;i++){

     lists.add("你好"+i);

     }

    ad =new ArrayAdapter<String>(getActivity(), android.R.layout.simple_expandable_list_item_1,lists);

}


@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

    setListAdapter(ad);

    ad.notifyDataSetChanged();

    return inflater.inflate(R.layout.a, null);

}


}

 a.xml

   <ListView android:id="@id/android:list"

               android:layout_width="match_parent"

               android:layout_height="match_parent"

               android:background="#00FF00"

               android:layout_weight="1"

               android:drawSelectorOnTop="false"/>

Activity

fm=getFragmentManager();

ft=fm.beginTransaction();

listf listf=new listf();

f1 f1=new f1();

ft.add(R.id.l1, listf, "listf");

ft.commit();

主布局 放入 l1 布局.



6.Fragment 传递值


创建

public class f2 extends Fragment {

TextView textView3;

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

String s= getArguments().getString("item");

View View =inflater.inflate(R.layout.c, null);

textView3=(TextView)View.findViewById(R.id.textView3);

textView3.setText(s);

return View;

}


在上面listf 加入单击事件

@Override

public void onListItemClick(ListView l, View v, int position, long id) {

super.onListItemClick(l, v, position, id);

String String = lists.get(position).toString();  //获取单击值

f2 f2 =new f2();                                   新建碎片


FragmentManager fm=getFragmentManager();       

FragmentTransaction ft=fm.beginTransaction();


 Bundle bundle=new Bundle();

 bundle.putString("item", String);                 写入值

 f2.setArguments(bundle);                         传递

 ft.replace(R.id.l2, f2);                         替换布局

 ft.commit();


}



7.

效果

 ft.setCustomAnimations(android.R.animator.fade_in,android.R.animator.fade_out);


8 向下兼容 

改成 导入import android.support.v4.app.FragmentManager;包

然后Activity 改成 FragmentActivity

getFragmentManager  改成 getSupportFragmentManager();


9.切换Fragment的办法


FragmentManager fm;

FragmentTransaction ft;

int t=0;//当前点击

int k=0;//上次打开

public List<Fragment> fragments = new ArrayList<Fragment>();

  fragments.add(new a());

  fragments.add(null);

  fragments.add(null);

  fragments.add(null);


//首先加载第一屏

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

ft.add(R.id.viewshow,fragments.get(0));

ft.commit();




点击事件内部。

switch (v.getId()) {

case R.id.imageButton1:

    t=0;

    Toast.makeText(getBaseContext(), "A", 1).show();

    break;

case R.id.imageButton2:

    t=1;

    Toast.makeText(getBaseContext(), "B", 1).show();

    break;

case R.id.imageButton3:

    t=2;

    Toast.makeText(getBaseContext(), "c", 1).show();

    break;

case R.id.imageButton4:

    t=3;

    Toast.makeText(getBaseContext(), "D", 1).show();

    break;

}

FragmentTransaction ft2 = getSupportFragmentManager().beginTransaction();

ft2.hide(fragments.get(k));//隐藏上次打开 

Fragment fragment1 = fragments.get(t);//获取本次要打开

if(fragment1==null)

{

Fragment nf=new_fragment(t);

fragments.set(t,nf);

ft2.add(R.id.viewshow,nf); 

}

else

ft2.show(fragments.get(t)); 

}

 k=t;

 ft2.commit();





private Fragment new_fragment(int i) {

    Fragment fragment;

     switch (i) {

     case 1:

     fragment=new b();

     break;

     case 2:

     fragment=new c();

     break;

     case 3:

     fragment=new d();

     break;

    

     default:

     fragment=new a();

     break;

     }

    

     return fragment;

}