梳子不爱头发 阅读(12) 评论(0)

                                                      AUF(Always Use Fragment)

 

 

【老习惯】:一直以来使用着Activity,也就是原生的Android项目最基本的形态,突然有一天打开一个开源project,在分类package里面看到了Fragment的分类,那么Fragment到底是干什么的呢,为什么面试官老问我Fragment和Activity的区别呢,那么我们今天通过一个例子来解惑,首先WHY?

 

【为什么使用】:UI灵活性,现在我们使用大部分app的时候,手动上下滑动或者是左右滑动便能加载出不同页面,这个似乎不是我们认知中Activity所能做到的事情,也不是繁杂的标签(TabHost)来做到的。 

如下图:

 

这种UI的灵活性是怎么做到的呢,activity本身并不具有这样的灵活性,activity可以在运行时候进行切换,但是控制试图代码必须在activity里面实现,看起来就是用Intent跳转喽,那怎么受得了,我只是想切换view而已

那么这里一下layout布局可以根据手势来切换不同的view么,很可惜不可以,因为崩掉了,所以每个activity终究还是要和特定的用户界面牢牢绑定的。

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_crime);

 于是就有了fragment,可不可以在主布局函数里面放一个容器(container),容器里面可以放一个view,而这个view还是可以管理的呢?这样我不就是可以实现多个view的添加了么?good  idea  当初想出Fragment的人肯定不是个天才,但是仍旧要说一声genius!!!,因为我们这些被苹果砸中的人却想不到,好吧,我只是吐槽我出生的太晚。。。。。。采用这样的方法就可以绕开Android系统activity规则的限制。

 

【fragment对象理解】fragment对象就是一个控制器,activity可以委派它去完成一些任务,在中央集权制的Android世界里,你不要指望Activity这个Boss会事必躬亲,这种小事就交给小弟Fragment做就好啦,它来管理一些用户界面,这些用户界面可以是屏幕的一部分或者一整屏。一个Activity会有多个小弟fragment,同时对应着多个容器,招募人家需要给人家容身之所。因此就完成了我们对多个view的初步构想,接下来实战演练,一个非常简单的demo带你理解 Fragment的Construction结构

================================================================================

【创建】:CrimeActivity+主布局函数activity_crime.xml

xml不需要做太多,但是在招小弟Fragment之前,请把容身之处Container安置好,just  like  this:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fragmentContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".CrimeActivity" >

    

</FrameLayout>

 【物色小弟fragment】:现在我们开始物色小弟,首先我们创建一个Crime用来标识ID要知道每个android的ID是十分重要的,代码如下:

public class Crime {
	/*
	 * UUID(Universally Unique Identifier)全局唯一标识符
	 * 是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的
	 */
	private UUID mId;
	private String myTitle;

	public Crime() {
		// TODO Auto-generated constructor stub
		mId=UUID.randomUUID();
	}

	public String getMyTitle() {
		return myTitle;
	}

	public void setMyTitle(String myTitle) {
		this.myTitle = myTitle;
	}

}

 接下来,重头戏:

【fragment】新建CrimeFragment类继承 Fragment

/*
 * author  by  ee
 */


public class CrimeFragment extends Fragment{
	private Crime crime;
	private EditText myTitleField;
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		crime=new Crime();
	}
	public View onCreateView(LayoutInflater inflater,ViewGroup parent,Bundle savedInstanceState){
		//载入试图,采用Inflater
		View v=inflater.inflate(R.layout.fragment_crime,parent, false);
		//获取fragment布局函数输入框对象
		myTitleField=(EditText)v.findViewById(R.id.crimetitle);
		//添加监听
		myTitleField.addTextChangedListener(new TextWatcher() {
			
			@Override
			public void onTextChanged(CharSequence c, int start, int before, int count) {
				// TODO Auto-generated method stub
				myTitleField.setText(c.toString());
			}
			
			@Override
			public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
					int arg3) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void afterTextChanged(Editable arg0) {
				// TODO Auto-generated method stub
				
			}
		});
		return v;
	}

}

 那么fragment_crime也是非常简单明了了:

<?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" >

    <EditText
        android:id="@+id/crimetitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/crime_title_hint"
        android:ems="10" >

        <requestFocus />
    </EditText>

</LinearLayout>

 hint是一个默认显示,但是用户输入时自动消失的提示语,相信大家都有遇到过,我们在string里面定义显示什么:

  <string name="crime_title_hint">为此界面输入一个标题</string>

 easy  get!

【tips】发现为什么Activity :

protected void onCreate

 而 Fragment是:

public void onCreate

 一个是受保护的方法,一个是公共方法因为需要被托管Fragment的任何Activity调用,意思就是老大管着你吃穿拉撒,你还有什么秘密想要隐瞒着老大不成,老大想要用你的资源就赶紧乖乖献上来,解释虽然是这样解释,但是我们学过父类子类的时候对四个访问权限,公共public  秘密private  ,保护protected,以及默认的,各自的权限都有了解过,所以真正原理是这样的。

================================================================================

【Activity】老大开始对愿意入会的小弟开始接收:

public class CrimeActivity extends FragmentActivity {


	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_crime);
		//FragmentManager管理器
		FragmentManager fm=getFragmentManager();
		Fragment fragment=fm.findFragmentById(R.id.fragmentContainer);
		if(fragment==null){
			fragment=new CrimeFragment();
			//FragmentManager管理器将调用 Transaction队列添加fragment到容器中
			
			fm.beginTransaction().add(R.id.fragmentContainer, fragment)
			.commit();
		}
	}

	

}

 每一个地盘绑定一个小弟。一一对应container和fragment

【实现效果】:这个时候运行app就可以吧Fragment内容显示出来了。大致上架构明白了吧

 

 

 

 

 

 

  • 大小: 18.3 KB
  • 大小: 10 KB