一、目标
相比前两种方法,此种方法是未来,更加灵活实用。
二、 目录
1、MainActivity.java:主程序
2、FirstFragment.java:第一个页面
3、SecondFragment.java:第二个页面
4、IViewClickListener.java:自定义接口,用于Fragment与Activity之间的通信
三、代码
1、MainActivity.java
package com.myandroid.helloandroid; import android.os.Bundle; import android.app.Activity; import android.app.FragmentTransaction; import android.view.Menu; import android.widget.Button; public class MainActivity extends Activity implements IViewClickListener { Button btn1; FirstFragment firstFragment; SecondFragment secondFragment; FragmentTransaction fragTransaction; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); addFirstFragment(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void doViewClick(int ViewId) { switch (ViewId) { case R.id.btn1: addSecondFragment(); break; } } private void addFirstFragment() { firstFragment = new FirstFragment(); fragTransaction = getFragmentManager().beginTransaction(); fragTransaction.add(R.id.flytContainer, firstFragment, "firstFragment"); fragTransaction.commit(); } private void addSecondFragment() { secondFragment = new SecondFragment(); fragTransaction = getFragmentManager().beginTransaction(); fragTransaction.replace(R.id.flytContainer, secondFragment, "secondFragment"); fragTransaction.addToBackStack(null); fragTransaction.commit(); } }
2、FirstFragment.java
package com.myandroid.helloandroid; import android.app.Activity; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; public class FirstFragment extends Fragment implements OnClickListener { View vRoot; Button btn1; private IViewClickListener iViewClickListener; @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); try {// 把其宿主Activity当成接口对象 iViewClickListener = (IViewClickListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement iViewClickListener"); } } @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { vRoot = inflater.inflate(R.layout.fragment_first, container, false); // 初始化界面 initFragmentView(); registerListener(); return vRoot; } private void registerListener() { btn1.setOnClickListener(this); } private void initFragmentView() { btn1 = (Button) vRoot.findViewById(R.id.btn1); } @Override public void onPause() { super.onPause(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn1: iViewClickListener.doViewClick(R.id.btn1); break; } } }
3、SecondFragment.javapackage com.myandroid.helloandroid; import android.app.Activity; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; public class SecondFragment extends Fragment implements OnClickListener { View vRoot; Button btn2; @Override public void onAttach(Activity activity) { super.onAttach(activity); } @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { vRoot = inflater.inflate(R.layout.fragment_second, container, false); // 初始化界面 initFragmentView(); registerListener(); return vRoot; } private void registerListener() { btn2.setOnClickListener(this); } private void initFragmentView() { btn2 = (Button) vRoot.findViewById(R.id.btn2); } @Override public void onPause() { super.onPause(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn2: //回退 getFragmentManager().popBackStack(); break; } } }
4、IViewClickListener.javapackage com.myandroid.helloandroid; public interface IViewClickListener { public void doViewClick(int ViewId); }
————————————————————以下为布局文件—————————————————————
5、activity_main.xml<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/flytContainer" android:layout_width="match_parent" android:layout_height="match_parent" > </FrameLayout>
6、fragment_first.xml
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/ttv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is FirstFragment" /> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/ttv1" android:layout_centerHorizontal="true" android:layout_marginTop="144dp" android:text="Go to SecondFragment" /> </RelativeLayout>
7、fragment_second.xml
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/ttv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is SecondFragment" /> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="186dp" android:text="Go to FirstFragment" /> </RelativeLayout>
四、讨论
1、Fragment是作为Android 3.0 honeycomb ( API 11 )发布版本的一部分引入的,如果想在较低版本上使用需添加Android支持包。
2、Fragment最大的优点是能够为不同大小的屏幕设备创建动态灵活的UI。
3、与Activity不同,Fragment不需要在AndroidManifest.xml中进行注册。
4、不建议Fragment之间直接通信,应以Activity作为媒介。
5、需要与Activity共享事件时,最好在Fragment中定义一个接口,然后在Activity中实现它。
以上谨代表个人的不成熟看法,欢迎路过的朋友拍砖斧正!
源码下载:http://download.csdn.net/detail/liyongliang_2012/7514355 文件名:HelloAndroid20140617.rar