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/

 

更多相关文章

  1. Android studio编译时出现aapt.exe 崩溃的解决方法
  2. listView中item 图文并存的两种方法
  3. 文件的读写操作
  4. 使用Android Studio开发百度地图LBS过程中遇到找不到so文件
  5. SQlite与android 的数据交互 (android 项目心得三)
  6. Android获取本机Mac地址及IP地址的方法
  7. android6.0创建文件问题
  8. Android 远程链接 daemon not running 解决方法

随机推荐

  1. Android开发textview中跑马灯效果
  2. android中布局的详解
  3. android 入门xml布局文件
  4. 传智播客android 视频课程列表
  5. 提取一个带计数框的EditText
  6. android改变字体的颜色的三种方法
  7. Android下修改SeekBar样式
  8. [Android(安卓)XML] --- android:scaleTy
  9. [置顶] Android(安卓)使用Android(安卓)S
  10. 分享:Android开发半月谈