Fragment使用

Fragment的介绍

Fragment是一个可重用的UI组件,这样可以提高程序的灵活性。Fragment可以理解为轻量级的Activity,比Activity的优点在于可以减少在AndroidMainfest.xml中定义,可以更好对不同设备的UI兼容。

1. 创建Fragment

示例一:

public class FragmentDemo1 extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment_details, null);
	}

}
<?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"
    android:gravity="center"
    android:background="@android:color/darker_gray" >

    <TextView
        android:id="@+id/detailsView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="新闻内容"
        android:textSize="25sp" />

</LinearLayout>

示例二:

public class FragmentDemo2 extends ListFragment {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 设置ListAdapter
		String[] topics = getResources().getStringArray(R.array.topics);
		ListAdapter adapter = new ArrayAdapter<String>(getActivity(),
				android.R.layout.simple_list_item_1, topics);
		setListAdapter(adapter);
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment_topics, null);
	}
}
fragment_topics.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" >

    <!-- 需要注意此处的list对应的id必须为:android:list -->

    <ListView
        android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

2. 将Fragment添加到Activity

a> 静态添加

在对应的xml中定义需要添加的fragment

示例:

<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="horizontal"
    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" >

    <fragment
        android:id="@+id/topic_container"
        android:name="zhangchao.android.fragmentdemo.TopicsFrament"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="horizontal" >
    </fragment>

    <fragment
        android:id="@+id/detail_container"
        android:name="zhangchao.android.fragmentdemo.DetailFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2"
        android:orientation="horizontal" >
    </fragment>

</LinearLayout>

b> 动态添加

必须在xml文件中定义好放置碎片的容器

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="horizontal" >

    <FrameLayout
        android:id="@+id/topic_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" >
    </FrameLayout>

    <FrameLayout
        android:id="@+id/detail_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="2" >
    </FrameLayout>

</LinearLayout>

代码:

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.acitivty_framlayout_main);
		Fragment topicFg = new TopicsFrament();
		Fragment detailsFg = new DetailFragment();		
		FragmentManager fgManager = getSupportFragmentManager();
		FragmentTransaction fgTransaction = fgManager.beginTransaction();
		fgTransaction.add(R.id.topic_container, topicFg);
		fgTransaction.add(R.id.detail_container, detailsFg);
		fgTransaction.commit();
		callback = (IContent) detailsFg;
//以下是静态添加设置回调		
//		setContentView(R.layout.activity_main);
//		FragmentManager fm = getSupportFragmentManager();
//		DetailFragment df = (DetailFragment) fm.findFragmentById(R.id.detail_container);
//		callback = (IContent)df;
	}

3. Fragment与Activity间通信

a> 暴露接口(推荐,这样可以降低耦合度)

示例:

public class TopicsFrament extends ListFragment {
	private ICommunicat callback;

	public interface ICommunicat {
		public void onTopicsSelected(int position);
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 设置ListAdapter
		String[] topics = getResources().getStringArray(R.array.topics);
		ListAdapter adapter = new ArrayAdapter<String>(getActivity(),
				android.R.layout.simple_list_item_1, topics);
		setListAdapter(adapter);
	}

	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);

		try {
			callback = (ICommunicat) activity;
		} catch (ClassCastException e) {
			throw new ClassCastException(activity.toString()
					+ " must implement ICommunicat");
		}
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment_topics, null);
	}
	
	@Override
	public void onListItemClick(ListView l, View v, int position, long id) {
		callback.onTopicsSelected(position);
		super.onListItemClick(l, v, position, id);
	}

b> 在activity中通过FragmentManager获取Fragment对象,通过对象的方法与其通信;

在Fragment中获取其中的View引用;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View v = inflater.inflate(R.layout.fragment_topics, null);
		TextView tv = (TextView) v.findViewById(R.id.detailsView);
		return v;
	}

4. Fragment向下兼容

使用google提供的兼容包,android-support-v4.jar,可以对不同的版本兼容。


总结:

1. 碎片对于不同设备的UI兼容灵活性高,尤其是动态添加。

2. 对于静态和动态添加可以根据需求具体而定。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值