详解Android开发中Fragment的使用

详解Android开发中Fragment的使用,第1张

概述前言学习Java和Android将近一年的时间了,期间的成果应该就是独立完成了一个Android客户端,并且保证了其在主线版本的稳定性。期间遇到了很多坑,也跟着师兄学到了很多Android知识。但是人总是要拥抱变化,不能让自

前言
学习Java和AndroID将近一年的时间了,期间的成果应该就是独立完成了一个AndroID客户端,并且保证了其在主线版本的稳定性。期间遇到了很多坑,也跟着师兄学到了很多AndroID知识。但是人总是要拥抱变化,不能让自己太安逸,虽然有不舍,但是我已经证明了自己的学习能力,下一步就是开始做Rom Porting了。这里总结一下之前项目中用到最多的Fragment。

Fragment简介
Fragment可以理解成Activity中用户界面的一个行为或者一部分,它必须被嵌套在Activity中。但是一个Fragment有它自己独立的xml布局文件,并且具有良好的封装性,因此特殊情况下Fragment可以很容易用Activity来进行替换。

创建Fragment
创建一个Fragment和创建Activity类似,需要实现XML布局文件和Java Class。
XML布局文件和其他布局文件都一样,例如如下所示的布局文件(fragment_layout.xml):

 <?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" >     <TextVIEw    androID:ID="@+ID/textVIEw"    androID:layout_wIDth="wrap_content"    androID:layout_height="wrap_content"    androID:text="@string/testvIEw" />     <button    androID:ID="@+ID/button"    androID:layout_wIDth="wrap_content"    androID:layout_height="wrap_content"    androID:text="@string/button" />    </linearLayout> 

Java代码中,一般情况下可以根据需要实现Fragment以下几个生命周期方法:
1. onAttach():当Fragment依附于activity时被调用,可以在该方法中获取activity句柄,从而实现Fragment和activity之间的通信。
2. onCreate():对Fragment做初始化。
3. onCreateVIEw():在第一次为Fragment绘制用户界面时系统会调用此方法。
4. onActivityCreated():在宿主Activity onCreate函数执行完成之后被调用,可以在这个方法里进行Fragment自己的Widget实例化和业务逻辑处理。
5. onDestoryVIEw():当Fragment开始被销毁时调用。
6. onStart():当Fragment可见时被调用。
还有许多其他用以 *** 纵Fragment生命周期中各个阶段的回调函数,大家可自行Google学习。

Fragment生命周期
每一个Fragment都有自己的一套生命周期回调方法和处理自己的用户输入事件。对应的生命周期如下图所示:

在Activity中加入Fragment
首先,需要确保Acitivity支持Fragment,因此Activity通常需要继承自FragmentActivity。在Activity中添加Fragment通常有两种方法:静态的和动态的。
静态方法
直接在Activity的XML布局文件中加入Fragment,如下所示:

 

 <?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:baselineAligned="false"   androID:orIEntation="horizontal" >     <fragment    androID:ID="@+ID/first"    androID:name="com.example.FristFragment"    androID:layout_wIDth="0dp"    androID:layout_height="match_parent"    androID:layout_weight="1" />     <fragment    androID:ID="@+ID/second"    androID:name="com.example.SecondFragment"    androID:layout_wIDth="0dp"    androID:layout_height="match_parent"    androID:layout_weight="1" />    </linearLayout> 

<fragment>中的androID:name 属性指定了布局中实例化的fragment类
当系统创建Activity布局时,它实例化了布局文件中指定的每一个Fragment,并且为它们调用onCreateVIEw()函数,以获取每一个fragment的布局。系统直接在<fragment>元素位置插入fragment返回的vIEw
注意:每个fragment都需要一个唯一的标识,如果重启activity,系统可用来恢复fragment(并且用来捕捉fragment的事务处理,例如移除)。为了Fragment提供ID有三种方法:

    用androID:ID属性提供一个唯一的标识     用androID:tag属性提供一个唯一的字符串     如果上述两个属性都没有,系统会使用其容器视图的ID

动态方法
使用FragmentTranscation。可以使用FragmentTranscation的API来对Activity的Fragment进行 *** 作(例如添加,移除,或者替换Fragment)。参考代码如下:

 FragmentManager fragmentManager = getFragmentManager()  FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();  ExampleFragment fragment = new ExampleFragment();  fragmentTransaction.add(R.ID.fragment_container,fragment);  fragmentTransaction.commit(); 

传入add()函数的第一个参数是Fragment被放置的VIEwGroup,它由资源ID(resource ID)指定,第二个参数就是要添加的fragment。一旦通过FragmentTranscation做了更改,都应当使用commit()视变化生效。

Fragments通信
Fragments之间不应该直接进行通信,它们之间的交互应该通过宿主Activity进行。有三种Fragment和Acitivity交互的方法:
1. Activity创建带参数的Fragment。
2. Activity中保持了Fragment的对象句柄,可通过句柄直接调用该Fragment的public方法。
3. Fragment可在onAttach函数中获取定义的Listener句柄。
创建带参数的Fragment
在某些特定的情况下,Fragment可能需要特定的参数来进行初始化。由于Fragment必须只有一个无参构造函数,因此可以考虑使用静态的newInstance方法来创建带参数的Fragment。示例代码如下:

  

 import androID.os.Bundle;  import androID.support.v4.app.Fragment;    public class TestFragment extends Fragment {   public static TestFragment newInstance(int num,String Title) {    TestFragment fragment = new TestFragment();    Bundle args = new Bundle();    args.putInt("num",num);    args.putString("Title",Title);    fragment.setArguments(args);    return fragment;   }     @OverrIDe   public voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);      int num = getArguments().getInt("num",0);    String Title = getArguments().getString("Title","");   }    } 

你可以在Activity里,简单的加载一个带参数的Fragment:

 FragmentTransaction ft = getSupportFragmentManager().beginTransaction();  TestFragment fragment = TestFragment.newInstance(5,"fragment Title");  ft.replace(R.ID.placeholder,fragment);  ft.commit(); 

调用Fragment的方法
因为Activity可以获取嵌入的Fragment的句柄,因此可以直接通过Fragment句柄调用该方法。

 public class TestFragment extends Fragment {   public voID doSomething(String param) {    // do something in fragment   }  } 

在Activity中,可以直接通过Fragment的对象句柄调用该方法:

 public class MainActivity extends FragmentActivity {   @OverrIDe   public voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    TestFragment testFragment = new TestFragment();    testFragment.doSomething("some param");   }  } 

Fragment Listener
如果Fragment需要共享事件给Activity,则需要利用这个方法。Fragment中定义一个接口,并且由Activity来实现这个接口。在onAttach()方法中将实现了这个接口的Activity获得到。
在Fragment中定义接口代码如下:

   

import androID.support.v4.app.Fragment;    public class MyListFragment extends Fragment {   // ...   // define the Listener of the interface type   // Listener is the activity itself   private OnItemSelectedListener Listener;     // define the events that the fragment will use to communicate   public interface OnItemSelectedListener {   public voID onRSSItemSelected(String link);   }     // Store the Listener (activity) that will have events fired once the fragment is attached   @OverrIDe   public voID onAttach(Activity activity) {   super.onAttach(activity);    if (activity instanceof OnItemSelectedListener) {    Listener = (OnItemSelectedListener) activity;    } else {    throw new ClassCastException(activity.toString()     + " must implement MyListFragment.OnItemSelectedListener");    }   }     // Now we can fire the event when the user selects something in the fragment   public voID onSomeClick(VIEw v) {    Listener.onRSSItemSelected("some link");   }  } 

在Activity中实现这个接口:

   

import androID.support.v4.app.FragmentActivity;    public class RSSFeedActivity extends FragmentActivity implements   MyListFragment.OnItemSelectedListener {   DetailFragment fragment;     @OverrIDe   protected voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentVIEw(R.layout.activity_RSSFeed);    fragment = (DetailFragment) getSupportFragmentManager()     .findFragmentByID(R.ID.detailFragment);   }     // Now we can define the action to take in the activity when the fragment event fires   @OverrIDe   public voID onRSSItemSelected(String link) {    if (fragment != null && fragment.isInLayout()) {     fragment.setText(link);    }   }  } 

总结

以上是内存溢出为你收集整理的详解Android开发中Fragment的使用全部内容,希望文章能够帮你解决详解Android开发中Fragment的使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1141409.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存