`

Fragment理解与入门:一个老大与小弟的故事

阅读更多

                                                      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规则的限制。

Activity比Fragment效率高。因为Activity可以单独使用,但是Fragment要放在Activity中去使用。

Fragment是为了解决同一款安卓软件不能在分辨率和不同屏幕的载体中使用的问题而产生的软件。可以把Fragment当成Activity的一个界面的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成,更帅气的是Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了。更为重要的是,你可以动态的添加、替换和移除某个Fragment。

 

【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
  • 大小: 14 KB
  • 大小: 11.4 KB
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics