一些优秀博客:
android Fragments详解四:管理fragment
Android Fragment应用实战,使用碎片向ActivityGroup说再见
Android Fragment完全解析,关于碎片你所需知道的一切
Android Fragment 真正的完全解析(上)
Android Fragment 真正的完全解析(下)
Android Fragment 你应该知道的一切
Android UI开发第二十六篇——Fragment间的通信
Android 官方推荐 : DialogFragment 创建对话框
Android App组件之ListFragment – 说明和示例
Android Fragment和FragmentActivity区别和用法
Android Fragment应用实战,使用碎片向ActivityGroup说再见
Android Fragment完全解析,关于碎片你所需知道的一切
Android Fragment 真正的完全解析(上)
Android Fragment 真正的完全解析(下)
Android Fragment 你应该知道的一切
Android UI开发第二十六篇——Fragment间的通信
Android 官方推荐 : DialogFragment 创建对话框
Android App组件之ListFragment – 说明和示例
Android Fragment和FragmentActivity区别和用法
Fragment生命周期


onAttached() —— 当fragment被加入到activity时调用(在这个方法中可以获得所在的activity)。
onCreateView() —— 当activity要得到fragment的layout时,调用此方法,fragment在其中创建自己的layout(界面)。
onActivityCreated() —— 当activity的onCreated()方法返回后调用此方法
onDestroyView() —— 当fragment中的视图被移除的时候,调用这个方法。
onDetach() —— 当fragment和activity分离的时候,调用这个方法。
Fragment与Activity
Fragment获取Activity实例 | Activity获取Fragment实例 |
getActivtiy() | getFragmentManager()>> FragmentManager: findFragmentById() findFragmentByTag() popBackStack():将Fragment从后台栈中弹出(模拟用户按下BACK按键) beginTransaction()>>
FragmentTransAction:
add(int containerViewId, Fragment fragment)
remove(R.id.framework,fragment) addToBackStack()
commit()
|
//Activity中
Fragment fragment =newFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction =fragmentManager.beginTransaction();
transaction.replace(R.id.framework,fragment);
transaction.addToBackStack();
transaction.commit();
Fragment与Activity相互通信
Activity向Fragment传递数据:
在Activity中创建Bundle数据包,并调用Fragment的setArguments(Bundle)即可将数据传到Fragment

Fragment向Activity传递数据/Activity需要在Fragment运行中进行实时通信:
在Fragment中定义一个内部回调接口,再让包含该Activity的Activity实现该回调接口(可通过接口方法在Fragment运行中与其进行实时通信),这样Fragment即可调用该接口方法将数据传回给Activity
例子
//
MainActivitypublicclassMainActivityextendsActivityimplements BookFragment.Callbacks
{
@Override
publicvoid onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book_twopane);
// 创建Bundle,准备向Fragment传入参数
Bundle arguments =newBundle();
arguments.putInt("name", x);
BookFragment fragment =newBookFragment();
fragment.setArguments(arguments);
getFragmentManager().beginTransaction()
.replace(R.id.book_detail_container, fragment).commit();}
// 实现Callbacks接口必须实现的方法
@Override
publicvoid someAction(string s)
{
String s1=s;//获取到fragment传来的参数
}
}
//activity_book_twopane.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:divider="?android:attr/dividerHorizontal"
android:showDividers="middle">
<!-- 添加一个Fragment -->
<fragment
android:name="org.crazyit.app.BookFragment"
android:id="@+id/book_list"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<!-- 添加一个FrameLayout容器 -->
<FrameLayout
android:id="@+id/book_detail_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"/>
</LinearLayout>
//
BookFragmentpublicclassBookFragment extends Fragment
{
privateCallbacks mCallbacks;
// 定义一个回调接口,该Fragment所在Activity需要实现该接口,该Fragment将通过该接口与它所在的Activity交互
public interface Callbacks
{
publicvoid someAction(String s);
}
@Override
publicvoid onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
@Override
publicView onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState)
{
View rootView = inflater.inflate(R.layout.fragment1,container,false);
TextView tv= ((TextView) rootView.findViewById(R.id.book_title));
tv.setText("");
return rootView;
}
@Override
publicvoid onAttach(Activity activity)
{
super.onAttach(activity);
// 如果Activity没有实现Callbacks接口,抛出异常
if(!(activity instanceof Callbacks))
{
thrownewIllegalStateException(
"BookListFragment所在的Activity必须实现Callbacks接口!");
}
// 把该Activity当成Callbacks对象
mCallbacks =(Callbacks)activity;
String s ="to activity";
mCallbacks.someAction(s);
}
@Override
publicvoid onDetach()
{
super.onDetach();
// 将mCallbacks赋为null。
mCallbacks = null;
}
}
//fragment1.xml
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
style="?android:attr/textAppearanceLarge"
android:id="@+id/book_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"/>
</LinearLayout>
Fragment : onActivityResult(int requestCode, int resultCode, Intent intent) not be called in fragment
Option 1 :
If you're calling startActivityForResult() from the fragment then you should call startActivityForResult() not getActivity().startActivityForResult(), as it will result in fragment onActivityResult().
If you're not sure where you're calling on startActivityForResult() and how you will be calling methods.
Option 2:
Since Activity gets the result of onActivityResult(), you will need to override the activity's onActivityResult() and call super.onActivityResult() to propagate to the respective fragment for unhandled results codes or for all.
Fragment设计逻辑
