Activity动态增加Fragment

运行效果如下


整个程序分为两部分:

1>第一部分NewItemFragment

效果如下:

Activity动态增加Fragment_第1张图片

1.1>布局文件如下:

<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="wrap_content"
    android:orientation="horizontal"
    tools:context="com.demo.cxc.todolistfragment.NewItemFragment">

    <EditText
        android:id="@+id/newItem_et"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:hint="@string/new_item_hint"/>
    <Button
        android:id="@+id/done_bt"
        android:text="@string/done_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

1.2>代码如下:

package com.demo.cxc.todolistfragment;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;


public class NewItemFragment extends Fragment {
    private EditText newItem_et;
    private Button done_bt;

    //声明一个接口实例,一旦Fragment保存绑定到了它的父Activity,就可以在OnAttach()中获得该Activity的引用
    private OnNewItemAddedListener mListener;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view= inflater.inflate(R.layout.fragment_new_item, container, false);


        newItem_et=(EditText)view.findViewById(R.id.newItem_et);
        done_bt=(Button) view.findViewById(R.id.done_bt);

        done_bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mListener.onNewItemAdded(newItem_et.getText().toString());
                newItem_et.setText("");
            }
        });

        return view;
    }


    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnNewItemAddedListener) activity;
        } catch (ClassCastException e) {
            //当该Fragment添加到Activity中时,当Activity没有实现Fragment中声明的接口时,会抛出该Exception
            throw new ClassCastException(activity.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    /*
    *Fragment通过该接口给其父Activity传递消息。
    * */
    public interface OnNewItemAddedListener {
        // TODO: Update argument type and name
        public void onNewItemAdded(String newItemString);
    }

}


2>第二部分:一个ListViewFragment

Activity动态增加Fragment_第2张图片
2.1>代码如下:

package com.demo.cxc.todolistfragment;

import android.app.Activity;
import android.os.Bundle;
import android.app.ListFragment;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;


import com.demo.cxc.todolistfragment.dummy.DummyContent;

/**
 * A fragment representing a list of Items.
 */
public class ItemListFragment extends ListFragment {
}
其中ListFragment是Fragment的封装类,可以通过绑定数据源呈现一个ListView作用它主要的UI展现方式。它提供了设置Adapter的方法,从而来使用各呈现列表条目。

3>MainActivity

3.1>布局如下:

<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"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/newItem_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></FrameLayout>
    <FrameLayout
        android:id="@+id/itemList_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></FrameLayout>
    <!--静态包含-->
    <!--

    <fragment
        android:name="com.demo.cxc.todolistfragment.NewItemFragment"
        android:id="@+id/newItemFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></fragment>
    <fragment
        android:name="com.demo.cxc.todolistfragment.ItemListFragment"
        android:id="@+id/itemListFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></fragment>



    -->
    </LinearLayout>


3.2>代码如下:

package com.demo.cxc.todolistfragment;

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;

import java.util.ArrayList;


public class MainActivity extends ActionBarActivity implements NewItemFragment.OnNewItemAddedListener {

    private static final String NEW_ITEM_FRAGMENT_TAG = "new_item_fragment_tag";
    private static final String ITEM_LIST_FRAGMENT_TAG = "item_list_fragment_tag";
    private ItemListFragment itemListFragment;
    private FragmentManager fragmentManager;

    private ArrayList<String> newItems;
    private ArrayAdapter<String> arrayAdapter;

    private void initViews() {
        fragmentManager = getFragmentManager();
        FragmentTransaction ft = fragmentManager.beginTransaction();
        /*往容器newItem_container里添加Fragment*/
        //add时未指定Tag,则要想得到该Fragment的引用时,可以使用fragmentManage.findFragmentById(R.id.newItem_container);
        ft.add(R.id.newItem_container, new NewItemFragment());
        /*
        add时指定Tag,则要想得到该Fragment的引用时,
        1>可以使用fragmentManage.findFragmentById(R.id.newItem_container);
        2>也可以使用fragmentManage.findFragmentByTag(NEW_ITEM_FRAGMENT_TAG);
        */
//        ft.add(R.id.newItem_container, new NewItemFragment(), NEW_ITEM_FRAGMENT_TAG);



        /*往容器itemList_container里添加Fragment*/
        //add时未指定Tag,则要想得到该Fragment的引用时,可以使用fragmentManage.findFragmentById(R.id.itemList_container);
        ft.add(R.id.itemList_container, new ItemListFragment());
        /*
        add时指定Tag,则要想得到该Fragment的引用时,
        1>可以使用fragmentManage.findFragmentById(R.id.itemList_container);
        2>也可以使用fragmentManage.findFragmentByTag(ITEM_LIST_FRAGMENT_TAG);
        */
//        ft.add(R.id.itemList_container, new ItemListFragment(), ITEM_LIST_FRAGMENT_TAG);


        ft.commit();

        newItems = new ArrayList<String>();
        arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, newItems);


    }

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


    @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
    protected void onResume() {
        super.onResume();
        /*
        * 如果在onCreate()方法中查找Fragment,会返回Null.
        * 因为此时,布局还没有加载完全,所以就把查找工作放在这里。
        * */
        //方法一:通过父容器的id查找该Fragment
        itemListFragment = (ItemListFragment) fragmentManager.findFragmentById(R.id.itemList_container);

        //方法二:通过add 时指定的Tag 来查找该Fragment
//        itemListFragment = (ItemListFragment) fragmentManager.findFragmentByTag(ITEM_LIST_FRAGMENT_TAG);

        if (itemListFragment != null) {
            itemListFragment.setListAdapter(arrayAdapter);

        } else {
            Log.i("CXC", "----------NULL--------------");
        }
    }


    @Override
    public void onNewItemAdded(String newItemString) {
        newItems.add(0, newItemString);
        arrayAdapter.notifyDataSetChanged();
    }
}




你可能感兴趣的:(Fragment)