傻啦吧唧的程序员丶

使用Fragment 实现动态UI 和 动态添加Fragment

首先写好每个Fragment:

1.在第一个Fragment写一个按钮,使其加载下一个Fragment

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="horizontal" >


        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="加载"/>

</LinearLayout>

java代码:

public class LeftFragment extends Fragment{


    OnClickButton mCallback;
    //定义一个接口
    public interface OnClickButton{
        //并实现一个方法,用来传值并在(onAttach()中绑定activity)
        public void onClickB();
    }
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //绑定布局文件并获取到里面的控件,特别 注意里面的  view
        View view = inflater.inflate(R.layout.fragment_left,null);
        Button button = (Button) view.findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mCallback.onClickB();
            }
        });
        return view;
    }

    /**
     * 绑定到activity
     * @param activity
     */
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mCallback = (OnClickButton) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }
}

加载显示出来的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="新闻内容" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

java文件:

public class RightFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_right, null);
        Button button = (Button) view.findViewById(R.id.button2);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //getActivity()   获取父类的activity
                Toast.makeText(getActivity(), "我是fragment", Toast.LENGTH_SHORT).show();
            }
        });
        return view;
    }
}

主类:

布局

给Fragment创建一个容器activity_main.xml  

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

注意:一定要写明id。

然后就在activity中实现Fragment add进去就行了!

//实现LeftFragment中定义的接口,主要用来传值或者按钮点击事件
public class MainActivity extends Activity implements LeftFragment.OnClickButton {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化第一个Fragment
        if (findViewById(R.id.fragment_container) != null){
            if (savedInstanceState != null) {
                return;
            }
        LeftFragment leftFragment = new LeftFragment();
        leftFragment.setArguments(getIntent().getExtras());
        getFragmentManager().beginTransaction().add(R.id.fragment_container,leftFragment).commit();
        }
    }

    /**
     * 实现接口中的方法和点击按钮后加载的fragment
     */
    @Override
    public void onClickB() {
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        RightFragment rightFragment = new RightFragment();
        transaction.replace(R.id.fragment_container, rightFragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }
}

这样就实现了一个很小的demo!

动态添加Fragment


首先新建两个fragment的布局文件

fragment1

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#00ff00" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is fragment 1"
        android:textColor="#000000"
        android:textSize="25sp" />

</LinearLayout>

fragment2

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#0000ff" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is fragment 2"
        android:textColor="#000000"
        android:textSize="25sp" />

</LinearLayout>

新建两个Fragment类继承Fragment

Fragment1

public class Fragmet1 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment1,container,false);
    }
}

Fragment2

public class Fragmet2 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment2,container,false);
    }
}

然后定义一个显示fragment的mainactivity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:baselineAligned="false" >

    <Button
        android:id="@+id/btn_show_fragment1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="显示Fragment1"/>

    <Button
        android:id="@+id/btn_show_fragment2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="显示Fragment2"/>

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

其中FrameLayout是用来显示Fragment的,在MainActivity中实现

public class MainActivity extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        Button button1 = (Button) findViewById(R.id.btn_show_fragment1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //动态添加Fragment
                FragmentManager manager = getSupportFragmentManager();
                FragmentTransaction ft = manager.beginTransaction();
                Fragmet1 fragmet1 = new Fragmet1();
                ft.add(R.id.fragment_container,fragmet1);
                ft.commit();
            }
        });
        Button button2 = (Button) findViewById(R.id.btn_show_fragment2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentManager manager = getSupportFragmentManager();
                FragmentTransaction ft = manager.beginTransaction();
                Fragmet2 fragmet2 = new Fragmet2();
                ft.add(R.id.fragment_container,fragmet2);
                ft.commit();
            }
        });
    }
}

ok 基本就完成了。

注意:

动态添加Fragment主要分为4步:

    • 1.获取到FragmentManager,在V4包中通过getSupportFragmentManager,在系统中原生的Fragment是通过getFragmentManager获得的。
    • 2.开启一个事务,通过调用beginTransaction方法开启。
    • 3.向容器内加入Fragment,一般使用add或者replace方法实现,需要传入容器的id和Fragment的实例。
    • 4.提交事务,调用commit方法提交。 

 

posted on 2016-03-16 17:47  傻啦吧唧的程序员丶  阅读(8974)  评论(0编辑  收藏  举报

导航