Fragment详解(一)--->核心基础以及Fragment与Activity传递数据完整示例

来源:互联网 发布:手机上的数据处理软件 编辑:程序博客网 时间:2024/05/01 04:58

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{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);}//实现TitlesListFragmentCallBack接口中的方法@Overridepublic void onItemSelected(int index) {DetailFragment detailFragment=new DetailFragment();Bundle bundle=new Bundle();bundle.putInt(Data.ID, index);//向detailFragment传入参数detailFragment.setArguments(bundle);//开始Fragment的事务TransactionFragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();//替换容器(container)原来的FragmentfragmentTransaction.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;@Overridepublic 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是否已经实现了接口@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);if (!(activity instanceof TitlesListFragmentCallBack)) {throw new IllegalStateException("TitlesListFragment所在的Activity必须实现TitlesListFragmentCallBack接口");}mTitlesListFragmentCallBack=(TitlesListFragmentCallBack) activity;}//当该Fragment从它所属的Activity中被删除时调用该方法@Overridepublic void onDetach() {super.onDetach();mTitlesListFragmentCallBack=null;}//点击ListFragment中某个条目时调用该方法@Overridepublic 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;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (getArguments().containsKey(Data.ID)) {id=getArguments().getInt(Data.ID);}}@Overridepublic 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,并指定使用中等分隔条 --><LinearLayoutxmlns: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容器 --><RelativeLayoutandroid: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>


 

原创粉丝点击