Fragment是一个和Activity息息相关的控件。一个Fragment必须总是嵌在一个Activity里,Activity的生命周期会直接影响到它,比如当Activity Paused的时候,Fragment也是Paused. 但是当Activity resume的时候,Fragment可以独立的进行任何包括添加,删除等的操作。
Fragment的生命周期和Activity十分类似,下面这个图是从Google文档上复制下来的Activity和Fragment的生命周期对比。当创建一个Fragment的时候,有以下三个方法是必须要实现的onCreate(),onCreateView(),onPause()。
在网上看到好多类似于PAD的UI实现,就是左边是一个list,右边显示相关内容。用的是ListFragment。我只想知道两个单纯的Fragment是怎么通信的?我写了一个最最简单的DEMO,就是一个Activity,里面有两个单独的fragment。当点击左边fragment的button时候,右边fragment显示一个单词。非常汗的是,这个我琢磨了老久,菜鸟啊。从头做起吧。Fragment间是不能直接进行通信的,必须通过跟Activity的间接通信来实现。
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class Book extends Activity implements OnArticleSelectedListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.book);
}
@Override
public void onArticleSelected(int id) {
switch (id) {
case R.id.button1 :
showDetail();
break;
.....
default:
break;
}
}
private void showDetail() {
DetailFragment df = (DetailFragment)getFragmentManager().
findFragmentById(R.id.detail_fragment);
df.updateDetail();
}
public static class ArticleFragment extends Fragment {
OnArticleSelectedListener mListener;
// Container Activity must implement this interface
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnArticleSelectedListener)activity;
} catch (ClassCastException e) {
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.article_view, container, false);
v.findViewById(R.id.button1).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onArticleSelected(R.id.button1);
}
});
return v;
}
}
public static class DetailFragment extends Fragment {
public View mView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.detail_view, container, false);
return mView;
}
public void updateDetail() {
TextView textView;
textView = (TextView)mView.findViewById(R.id.text_1);
textView.setText("Emily");
}
}
}
public interface OnArticleSelectedListener {
public void onArticleSelected(int id);
}
最终出来是这个样子:
Google文档上的相关内容。
http://developer.android.com/guide/components/fragments.html
http://developer.android.com/training/basics/fragments/index.html