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. 对于静态和动态添加可以根据需求具体而定。