Android Fragment 使用如果使用android.support.v4.app.Fragment;

可以兼容到android版本1.6

为了配合android.support.v4.app.Fragment 请Activity继承FragmentActivity 否则会报错的

//官方文档介绍

FragmentActivity is a special activity provided in the Support Library to handle fragments on system versions older than API level 11

 

使用这个包,android.app.Fragment你的android api版本必须高于 11

可以继承普通的Activity。

 

如果你的Activity继承AppComactActivity 

使用android.support.v4.app.Fragment不需要再继承FragmentActivity了

记得主题一定要换成Thrme.AppCompat....

最简单使用Fragment的方法:

 

1.实现Fragment布局文件 fragment_text.xml

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text="this is a fragment"
        />
 </LinearLayout>

2.实现Fragment类

public class TextFragment extends Fragment {
     @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle  savedInstanceState) {
         return inflater.inflate(R.layout.fragment_text,container,false);
     }
 }

3.在Acvivity布局文件中加入fragment

<fragment android:name="com.gac.fragmentdemo.TextFragment"
    android:id="@+id/id_textfragment"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"

    />

4.实现Activity类

public class MainActivity extends FragmentActivity {

     @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
     }

     @Override
    public boolean onCreateOptionsMenu(Menu menu) {
         // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
         return true;
     }

     @Override
    public boolean onOptionsItemSelected(MenuItem item) {
         // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

         //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
             return true;
         }

         return super.onOptionsItemSelected(item);
     }
 }

 

 

动态添加fragment 或者切换不同的fragment

在activity布局文件中添加一个容器布局文件

<FrameLayout
    android:id="@+id/id_fragment_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"

    ></FrameLayout>

在actvity中//动态添加Fragment

public void addFragment(){
      OneFragment fragment = new OneFragment();
      getSupportFragmentManager().beginTransaction()
         .add(R.id.id_fragment_container, fragment).commit();
 }

在activity中切换两个fragment

 fragment.setArguments(bundle);添加bundle数据

在fragment初始化onCreateView 方法中通过getArguments 获取bundle

切换到FragmentOne 通过fragment容器文件 添加fragment

方法是调用 transaction.replace方法

public void addFragmentOne(){
     if(container != null){
         OneFragment fragment = new OneFragment();
         Bundle bundle = new Bundle();
         bundle.putString("text","this is bundle for one fragment");

         fragment.setArguments(bundle);
         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();


         transaction.replace(R.id.id_fragment_container, fragment);
         transaction.addToBackStack(null);


         transaction.commit();
     }
 }

切换到FragmentTwo 通过fragment容器文件 添加fragment

方法是调用 transaction.replace方法

 

private void addFragmentTwo(){
     if(container != null){
         TwoFragment fragment = new TwoFragment();
         Bundle bundle = new Bundle();
         bundle.putString("text", "this is bundle for two fragment");

         fragment.setArguments(bundle);
         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();


         transaction.replace(R.id.id_fragment_container, fragment);
         transaction.addToBackStack(null);
        // getSupportFragmentManager().beginTransaction()
            //    .add(R.id.id_fragment_container, fragment).commit();
        transaction.commit();
     }

只要不停的调用 addFragmentOne 和addFragmentTwo 两个方法就可以实现Fragment在一个容器FrameLayout布局文件中的切换。

 

 

在两个fragment通信,传递数据,一般Fragment直接传递数据不可以直接传递,都是通过他们两相关联的Activity作为中间者传递数据。

Android官方介绍了一种传递数据的方法:

http://developer.android.com/training/basics/fragments/communicating.html

 

在需要传递数据的Fragment中写一个回调接口,

private OnTextClickListener listener;
public interface OnTextClickListener{
     public void textClick(String str);
 }

在需要传递数据的Fragment onAttach方法中,初始化这个接口 前提就是Activity 实现这个接口

@Override
public void onAttach(Activity activity) {
     super.onAttach(activity);

     // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
         listener = (OnTextClickListener) activity;
     } catch (ClassCastException e) {
         throw new ClassCastException(activity.toString()
                 + " must implement OnTextClickListener");
     }
 }

 

在Activity中实现这个接口,和方法textClick

public  class MainActivity extends AppCompatActivity implements TextFragment.OnTextClickListener

 

在textClick方法中 activity得到了 fragment需要传递的数据

剩下的事情就是将数据传递给需要数据的Fragment

这里有两种不同的情况:

第一种就是 Activity 同时有两个Fragment

此时只需要得到fragment的示例 并非调用接收数据的方法就可以了

OneFragment fragment = (OneFragment)
             getSupportFragmentManager().findFragmentById(R.id.id_one);

     fragment.print(str);

第二种就是,Activity 里是一个容器 来回切换fragment情况

此时需要new一个新的接收数据的Fragment,把传递的数据作为参数传递给这个Fragment

在调用切换Fragment方法 就可以 

transaction.replace(R.id.id_fragment_container, newFragment);
 
 TwoFragment newFragment = new TwoFragment();
    Bundle args = new Bundle();
    args.putString("data", str);
    newFragment.setArguments(args);

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();


    transaction.replace(R.id.id_fragment_container, newFragment);
    transaction.addToBackStack(null);

    // Commit the transaction
    transaction.commit();@Override
public void textClick(String str) {
     OneFragment fragment = (OneFragment)
             getSupportFragmentManager().findFragmentById(R.id.id_one);

     fragment.print(str);
     /*
    *


    *  //对于一个container 两个fragment切换的情况 传递数据的方法
    //就是切换fragment new出需要数据的fragment 将传递的数据作为参数 加入new出的fragment 调用切换frament 方法代码如下

TwoFragment newFragment = new TwoFragment();
    Bundle args = new Bundle();
    args.putString("data", str);
    newFragment.setArguments(args);

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();


    transaction.replace(R.id.id_fragment_container, newFragment);
    transaction.addToBackStack(null);

    // Commit the transaction
    transaction.commit();
    *
    *
    *
    *
    * */

}


demo下载地址:https://github.com/gacmy/adnroidFragmentDemo/