运行效果如下
整个程序分为两部分:
1>第一部分NewItemFragment
效果如下:
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>
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); } }
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>
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(); } }