Android Fragment基础之动态添加Fragment 实现两个Fragment之间的通信


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/

 

你可能感兴趣的:(android)