fragment是可以放置在活动中的一个应用程序的用户界面或行为。
fragment的生命周期与受所处的activity的生命周期控制,同时它也拥有自己的生命的周期,包括基本的生命周期以及与用户进行交互的生命周期。以下为使fragment恢复恢复状态(与用户进行交互)的核心系列生命周期方法:
1、onAttach:一旦该fragment与其活动相关联,就会调用
2、onCreate:对fragment进行初始化
3、onCreateView:创建并返回与fragment相关联的视图层次结构.
4、onActivityCreated:告诉fragment其activity已经完成了自己的Activity.onCreate().
5、onViewStateRestored:告诉fragment其视图层次结构的所有保存状态已被还原.
6、onStart:使该fragment对用户可见.
7、onResume:使fragment开始与用户进行交互.
可以通过两种方式向 activity 添加fragment:
1、在 Activity 的xml文件中添加,将fragment作为view来定义
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent">
<fragment android:name="com.example.Fragment" android:id="@+id/list" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" />
</LinearLayout>
2、通过代码将fragment添加到某个ViewGroup
主要是通过FragmentManager来获取实例
FragmentManager fragmag = getFragmentManager();
FragmentTransaction fragtrans = fragmag.beginTransaction();
ExampleFragment fragment = new ExampleFragment();
fragtrans.add(R.id.fragment, fragment);
fragtrans.commit();
FragmentManager可以对fragment进行管理:
findFragmentById():通过fragment的id获取fragment
popBackStack():将fragment从返回栈中弹出
addOnBackStackChangedListener():注册一个侦听返回栈变化的侦听器
FragmentTransaction用于执行fragment的事务,根据用户行为实现添加、移除、替换以及其他操作,一旦通过FragmentTransaction做出了更改,就必须调用commit()使更改生效。
主要代码:
MainActivity.java
public class MainActivity extends Activity implements OnClickListener {
private Button one,two,three;
private FragmentManager fm;
private FragmentTransaction ft;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
one = (Button)this.findViewById(R.id.one);
two = (Button)this.findViewById(R.id.two);
three = (Button) this.findViewById(R.id.three);
one.setOnClickListener(this);
two.setOnClickListener(this);
three.setOnClickListener(this);
}
@Override
public void onClick(View v) {
fm = getFragmentManager();
ft = fm.beginTransaction();
if(v == one){
Intent intent = new Intent(MainActivity.this, oneFragment.class);
startActivity(intent);
}else if(v == two){
ft.replace(R.id.fragment_content,new twoFragment());
}else if(v == three){
ft.add(R.id.fragment_content,new threeFragment());
}
ft.commit();
}
}
按钮“one”实现跳转到另一个activity,按钮“two”主要用Transaction的replace方法添加fragment,按钮“three”主要用Transaction的add方法添加fragment。
replace方法会更新fragment,而add方法在原有的fragment上添加了新的fragment。
可看一下两图的效果:
这是在点击按钮two后再点击按钮three的效果,两个fragment重叠在一起
这是在点击按钮three后再点击按钮two的效果,此时只显示fragmenttwo
按钮“one”跳转实现的oneFragment是显示花的品种及其相应的信息,主要代码如下:
public class oneFragment extends Activity implements oneListFragment.Callbacks{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.one_main);
}
// 实现Callbacks接口必须实现的方法
@Override
public void onItemSelected(Integer id)
{
Bundle arguments = new Bundle();
arguments.putInt(DesFragment.ITEM_ID, id);
DesFragment fragment = new DesFragment();
fragment.setArguments(arguments);
getFragmentManager().beginTransaction()
.replace(R.id.fragment_content, fragment)
.commit();
}
}
oneListFragment主要用于显示fragment,以及处理fragment,以实现点击相应的花品种显示相应的信息在fraglayout中,效果如下图所示:
oneListFragment.java
public class oneListFragment extends ListFragment {
private Callbacks mCallbacks;
// 定义一个回调接口,该Fragment所在Activity必须实现该接口
public interface Callbacks {
public void onItemSelected(Integer id);
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//用adapter填充fragment
setListAdapter(new ArrayAdapter<Connect.Flower>(getActivity(),
android.R.layout.simple_list_item_activated_1,
android.R.id.text1, Connect.ITEMS));
}
// 当该Fragment被添加时,回调该方法
@Override
public void onAttach(Activity activity)
{
super.onAttach(activity);
if (!(activity instanceof Callbacks))
{
throw new IllegalStateException(
"error");
}
mCallbacks = (Callbacks)activity;
}
// 当该Fragment被删除时,回调该方法
@Override
public void onDetach()
{
super.onDetach();
mCallbacks = null;
}
// 当用户单击某列表项时激发该方法
@Override
public void onListItemClick(ListView listView
, View view, int position, long id)
{
super.onListItemClick(listView, view, position, id);
// 激发mCallbacks的onItemSelected方法
mCallbacks.onItemSelected(Connect
.ITEMS.get(position).id);
}
}
作者:魏超凡:原文地址