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