FragmentActivity与Activity区别
fragment是3.0以后的东西,为了在低版本中使用fragment就要用到android-support-v4.jar兼容包,而fragmentActivity就是这个兼容包里面的,它提供了操作fragment的一些方法,其功能跟3.0及以后的版本的Activity的功能一样。 下面是API中的原话:FragmentActivity is a special activity provided in the Support Library to handle fragments on system versions older than API level 11. If the lowest system version you support is API level 11 or higher, then you can use a regular Activity.
具体区别1、FragmentActivity继承自Activity,用来解决android3.0之前没有fragment的问题,所以在3.0前使用Fragment时需要导入support包,同时让Activity继承FragmentActivity,这样就能在activity中使用fragment了。
2、在3.0之后你直接继承自Activity就可以使用fragment。
3、两者获得FragmentManager的方式也不同,3.0之前使用FragmentActivity时:getSupportFragmentManager(),3.0以后使用Activity时:getFragmentManager()
4、一定要保证你的Activity中和你的Fragment中导的包是一致的!
小细节:Fragment嵌套Fragment时,里面的Fragment要用getChildFragmentManager获取到的fm比如:Fragment里放ViewPager,ViewPager里面又是fragment时
Fragment与Activity通信
因为所有的Fragment都是依附于Activity的,所以通信起来并不复杂,大概归纳为:
- a、如果你Activity中包含自己管理的Fragment的引用,可以通过此引用直接访问Fragment所有的public方法
- b、如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。
- c、在Fragment中可以通过getActivity()得到当前绑定的Activity的实例,然后进行操作。
注:如果在Fragment中需要Context,可以通过调用getActivity(),如果该Context需要在Activity被销毁后还存在,则使用getActivity().getApplicationContext()。
Fragment与Activity通信的原则:因为要考虑Fragment的重复使用,所以必须降低Fragment与Activity的耦合,而且Fragment更不应该直接操作别的Fragment,毕竟Fragment操作应该由它的管理者Activity来决定。Activity担任的是Fragment间类似总线一样的角色,应当由它决定Fragment如何操作。另外虽然Fragment不能响应Intent打开,但是Activity可以,Activity可以接收Intent,然后根据参数判断显示哪个Fragment。
静态fragment案例-Activity
注意:1、要通过android:name属性指定所引用的fragment的全类名2、必须给fragment设置id,即使完全用不到
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}}
<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="vertical" ><fragmentandroid:id="@+id/fragment1"【必须设置id,即使完全用不到】android:name="com.bqt.fragment.TitleFragment"【引用的哪个就写哪个的全类名】android:layout_width="fill_parent"android:layout_height="45dp" /><fragmentandroid:id="@+id/fragment2"android:name="com.bqt.fragment.ContentFragment"android:layout_width="fill_parent"android:layout_height="fill_parent" /></LinearLayout>
fragment
public class ContentFragment extends Fragment implements OnClickListener {private TextView tv;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_content, container, false);tv = (TextView) view.findViewById(R.id.tv);tv.setOnClickListener(this);return view;}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.tv:tv.append("\n" + new SimpleDateFormat("yyyy.MM.dd HH-mm-ss").format(new Date()));break;}}}
<?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" ><TextViewandroid:id="@+id/tv"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center"android:text="把Fragment当做一个view使用,一切关于此界面的代码全部放在Fragment中"android:textSize="20sp" /></LinearLayout>
public class TitleFragment extends Fragment {
@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_title, container, false);}}
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="45dp"android:background="#c000" ><TextViewandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center"android:text="微信"android:textColor="#fff"android:textSize="20sp"android:textStyle="bold" /></RelativeLayout>