`

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
分享到:
评论

相关推荐

    Fragment的最佳实践-一个简易版的新闻应用

    本项目"Fragment的最佳实践-一个简易版的新闻应用"旨在通过实例展示如何有效地使用Fragment来创建一个功能完备的应用。以下是一些关于Fragment的关键知识点和最佳实践: 1. **Fragment的生命周期**:Fragment有自己...

    1_fragment入门

    在Android应用开发中,...总之,"1_fragment入门"这个主题涵盖了Android应用开发中Fragment的基础知识,通过学习和实践,开发者能够更好地理解和利用Fragment构建适应各种设备的复杂用户界面,提升应用的用户体验。

    Android Fragment的使用-一个Fragment影响另外一个fragment。

    Android Fragment的使用。...功能:用一个Activity来管理两个Fragment,并且在其中一个Fragment中,点击按钮,影响到第二个Fragment。Activity中用list来管理Fragment。fragment布局采用垂直排列。

    Fragment的四种跳转方式:Fragment_Activity_skiptest.

    1、从同一个Activiy的一个Fragment跳转到另外一个Fragment 2、从一个Activity的Fragment跳转到另外一个Activity 3、从一个Activity跳转到另外一个Activity的Fragment上 4、从一个Activity的Fragment跳转到另外一个...

    activity与fragment以及fragment与fragment之间的通信

    3. **设置Target Fragment**:在添加Fragment时,可以指定一个目标Fragment(通过`setTargetFragment()`),然后在Fragment内部通过`getTargetFragment()`获取并通信。这种方式适用于Fragment需要向另一个Fragment...

    androidx-fragment-1.1.0.aar

    androidx-fragment-1.1.0.aar

    fragment activity与fragment相互传值 fragment与fragment跳转

    总之,理解并熟练掌握Fragment与Activity之间以及Fragment之间的数据传递和跳转是Android开发中的重要技能。这不仅可以帮助构建灵活的用户界面,还能提高代码的可复用性和可维护性。在实际项目中,应根据具体场景...

    Fragment与Activity之间通信实例

    Fragment代表一个可重用的UI部分,而Activity则是程序中的一个窗口,它可以包含一个或多个Fragment。Fragment与Activity之间的通信是Android开发中常见的需求,特别是在创建复杂、动态布局时。本实例将深入探讨这一...

    fragment的基础使用方法

    Fragment是Android应用开发中的一个重要组件,它允许开发者在同一个Activity中管理多个UI片段。这个"fragment的基础使用方法"主题将深入探讨Fragment的创建、添加、替换以及与Activity交互的细节。 1. **Fragment的...

    Fragment嵌套Fragment实现多tab页面

    在Android中,TabLayout通常与ViewPager结合使用来创建滑动选项卡,每个选项卡对应一个Fragment。Fragment嵌套则是指在一个Fragment内部再包含其他的Fragment,这样的设计可以将复杂的界面逻辑分解为更小、更易管理...

    点击退出返回上一个Fragment

    在Android应用开发中,Fragment是Activity的一个模块化组件,它可以在Activity中添加、移除或替换,用于构建灵活且复杂的用户界面。"点击退出返回上一个Fragment"这一主题涉及到Fragment的回退栈管理和用户交互。...

    Android中在xml中静态添加Fragment

    Fragment是一个可嵌入到Activity中的UI片段,它可以有自己的生命周期,接收用户输入,并与Activity进行数据交换。Fragment可以单独管理其视图和逻辑,从而提高了代码的可复用性和模块化。 二、XML中添加Fragment的...

    ViewPager+Fragment,Fragment嵌套Fragment实现页面活动

    `ViewPager`是Android Support Library的一部分,它允许用户左右滑动来浏览多个页面,而`Fragment`则是一个可以添加到Activity中的模块化屏幕部分。在某些情况下,我们可能需要在一个`Fragment`中嵌套另一个`...

    Android fragment demo

    `Android fragment demo`是关于如何使用Fragment的一个示例集合,它包含了多个片段(`fragment`, `fragment1`, `fragment2`, `fragment3`)的实例,帮助开发者理解并掌握Fragment的基本用法和常见操作。 Fragment的...

    android实现fragment框架

    Fragment是一个可以包含UI元素的部分,它可以独立于Activity存在,也可以与多个Activity共享。在Fragment中,我们可以定义布局、处理用户交互和执行后台任务。Fragment的生命周期与Activity紧密关联,当Activity状态...

    android fragment 使用以及嵌套使用 底部菜单和顶部菜单

    - 主Fragment管理子Fragment:在一个Fragment内部可以添加其他Fragment,创建并添加子Fragment的方式与在Activity中类似。 - 处理嵌套Fragment的生命周期:注意主Fragment的生命周期会影响到子Fragment,需适当地...

    fragment的显示与隐藏

    在Android应用开发中,Fragment是Activity的一个模块化组件,它可以在Activity中添加、删除或替换。Fragment提供了更灵活的方式来组织用户界面,特别是在处理大屏幕设备和复杂布局时。本篇文章将详细探讨Fragment的...

    android组件Fragment介绍

    创建 Fragment: 要创建一个 Fragment,必须创建一个 Fragment 的子类(或者继承自一个已存在的它的子类)。Fragment 类的代码看起来很像 Activity。它包含了和 Activity 类似的回调方法,例如 onCreate()、onStart...

    安卓 从一个Activity的指定fragment跳转到另一个Activity的指定fragment

    Demo结构 fragment_first.xml fragment_second.xml fragment_main.xml 效果图: 原创文章 2获赞 1访问量 119 关注 私信 展开阅读全文 作者:河边啃母鸡

    一个简单的activty+4个fragment

    分析这些文件可以帮助深入理解Activity和Fragment的交互方式以及如何构建一个基于Fragment的多模块应用。 总之,"一个简单的activty+4个fragment"的项目展示了Android开发中Activity和Fragment的基本用法,它是构建...

Global site tag (gtag.js) - Google Analytics