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

简介: MainActivity如下: package cc.testsimplefragment0;import android.os.Bundle;import android.

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>


 

相关文章
|
Java API Kotlin
教你用更好的方式在Activity或Fragment之间传递以及返回数据
教你用更好的方式在Activity或Fragment之间传递以及返回数据
313 0
教你用更好的方式在Activity或Fragment之间传递以及返回数据
|
Android开发
Android--fragment与activity及两个fragment之间的跳转实现
在应用的交互中,我可能需要实现: 从当前的fragment跳转到另一个fragment 从当前的fragment跳转到一个activity中 从当前的activity跳转到一个fragment中 网上提供的思路较多,这里总结了一套自己的方法。
2018 0
使用NavHostFragment、navigation--- avtivity向fragment传值,fragment之间传值
使用NavHostFragment、navigation--- avtivity向fragment传值,fragment之间传值
243 0
|
Android开发
Activity、Window、View三者关系
目录介绍 01.Window,View,子Window 02.什么是Activity 03.什么是Window 04.什么是DecorView 05.什么是View 06.关系结构图 07.Window创建过程 08.
1008 0
|
Android开发 数据格式 XML
Android Activity之间的传值示例
版权声明:本文可能为博主原创文章,若标明出处可随便转载。 https://blog.
799 0
|
XML API Android开发