MainActivity如下:
package cc.testsimplefragment0; import android.os.Bundle; import android.app.Activity; import android.app.FragmentTransaction; import cc.testsimplefragment0.TitlesListFragment.TitlesListFragmentCallBack; /** * Demo描述: * Fragment基本使用以及Fragment与Activity之间数据的传递 * * 参考资料: * Android疯狂讲义(第二版) * * 备注说明: * 利用接口实现Fragment与Activity的信息传递. * 这个思路是不错的. * 在此总结一下Fragment与Activity之间交换数据的方式: * 1 Activity向Fragment传递数据 * fragment.setArguments(bundle) * 2 Fragment向Activity传递数据 * 在Fragment内部定义一个回调接口.让包含该Fragment的 * Activity实现该接口.这样Fragment就可调用该回调方法 * 将数据传给Activity * */ public class MainActivity extends Activity implements TitlesListFragmentCallBack{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } //实现TitlesListFragmentCallBack接口中的方法 @Override public void onItemSelected(int index) { DetailFragment detailFragment=new DetailFragment(); Bundle bundle=new Bundle(); bundle.putInt(Data.ID, index); //向detailFragment传入参数 detailFragment.setArguments(bundle); //开始Fragment的事务Transaction FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); //替换容器(container)原来的Fragment fragmentTransaction.replace(R.id.relativeLayoutContainer, detailFragment); //设置转换效果 fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); //将事务添加到Back栈.即按下Back键时回到替换Fragment之前的状态.类似于Activity的返回 fragmentTransaction.addToBackStack(null); //提交事务 fragmentTransaction.commit(); } }
TitlesListFragment如下:
package cc.testsimplefragment0; import android.app.Activity; import android.app.ListFragment; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; /** * 备注说明: * 因为是继承自ListFragment * 所以不用覆写onCreateView()方法 * */ public class TitlesListFragment extends ListFragment { private TitlesListFragmentCallBack mTitlesListFragmentCallBack; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //设置适配器 ArrayAdapter<String> arrayAdapter= new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_checked, Data.TITLES); setListAdapter(arrayAdapter); } //当该Fragment被添加,显示到Activity时调用该方法 //在此判断显示到的Activity是否已经实现了接口 @Override public void onAttach(Activity activity) { super.onAttach(activity); if (!(activity instanceof TitlesListFragmentCallBack)) { throw new IllegalStateException("TitlesListFragment所在的Activity必须实现TitlesListFragmentCallBack接口"); } mTitlesListFragmentCallBack=(TitlesListFragmentCallBack) activity; } //当该Fragment从它所属的Activity中被删除时调用该方法 @Override public void onDetach() { super.onDetach(); mTitlesListFragmentCallBack=null; } //点击ListFragment中某个条目时调用该方法 @Override public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); mTitlesListFragmentCallBack.onItemSelected(position); //设置ListView为单选模式 getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); //显示选中的条目 getListView().setItemChecked(position, true); } //定义一个业务接口 //该Fragment所在Activity需要实现该接口 //该Fragment将通过此接口与它所在的Activity交互 public interface TitlesListFragmentCallBack{ public void onItemSelected(int index); } }
DetailFragment如下:
package cc.testsimplefragment0; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class DetailFragment extends Fragment { private int id=0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments().containsKey(Data.ID)) { id=getArguments().getInt(Data.ID); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View view=inflater.inflate(R.layout.detail_fragment, container, false); TextView titleTextView=(TextView) view.findViewById(R.id.titleTextView); titleTextView.setText(Data.TITLES[id]); TextView detailTextView=(TextView) view.findViewById(R.id.detailTextView); detailTextView.setText(Data.DETAILS[id]); return view; } }
Data如下:
package cc.testsimplefragment0; public final class Data { public static final String ID="id"; //标题 public static final String[] TITLES = { "标题1","标题2", "标题3","标题4"}; //内容 public static final String[] DETAILS = { "内容1","内容2", "内容3","内容4"}; }
main.xml如下:
<?xml version="1.0" encoding="utf-8"?> <!-- 定义一个水平排列的LinearLayout,并指定使用中等分隔条 --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" android:divider="?android:attr/dividerHorizontal" android:showDividers="middle"> <!-- 添加一个Fragment --> <fragment android:id="@+id/titlesListFragment" android:name="cc.testsimplefragment0.TitlesListFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> <!-- 添加一个RelativeLayout容器 --> <RelativeLayout android:id="@+id/relativeLayoutContainer" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="3" /> </LinearLayout>
detail_fragment.xml如下:
<?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/titleTextView" style="?android:attr/textAppearanceLarge" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp" /> <!-- 显示详细 --> <TextView android:id="@+id/detailTextView" style="?android:attr/textAppearanceMedium" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" /> </LinearLayout>
AndroidManifest.xml如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cc.testsimplefragment0" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="cc.testsimplefragment0.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>