Android碎片:Fragment

Fragment的作用:

  Fragment的产生其实是谷歌为了解决手机端和平板端软件开发的问题,在Fragment出来之前开发安卓软件如果要同时运行在pad和手机上就得开发两个软件,有了碎片也就是Fragment之后只要开发一个软件就可以适应pad和手机,不受屏幕大小的影响。而且Fragment有自己生命周期使用起来超级方便,逻辑处理可以直接在Fragment里面处理好,然后在Activity中有需要的地方引用这个Fragment就行了

Fragment有android.support.v4.app.fragment包和android.app.fragment之分,它俩的区别在于: 
android.app.fragment包是是3.0以后的系统才能使用的,也就是说3.0以前的系统是没法体验到这个包的功能。 
而android.support.v4.app.fragment包是为了向下兼容,使低版本(到1.6版本)也能体验到fragment的功能。 
推荐使用v4包下的,这样可以使APP适应更多机型。 
它俩在使用上也是有区别的: 
1.首先一点是在管理fragment的主activity上, app包下的照样继承Activity,但是v4包下的需要继承FragmentActivity, 
2.对FragmentManager的获取,在app包下需要使用getFragmentManager()

FragmentMagnager fm=getFragmentManager();

在v4包下需要使用getSupportFragmentManager()来获取管理,代码如下:

FragmentMagnager fm=getSupportFragmentManager();

我们把用来显示特定的fragment的动作称之为事务,事务通过FragmentTransaction来执行,用以下方法对FragmentTransaction进行实例化:

FragmentTransaction transaction=fragmentManager.beginTransaction();

现在记录怎么使用Fragment:

  • 静态使用
  • 动态使用

首先当然是先试试最简单的一种使用方法:静态使用Fragment

其实静态使用的这种方式就相当于把Fragment当成一个控件,当我们定义好了这个控件之后就可以在Activity的布局文件中直接使用了。

步骤一:创建一个布局文件,这个布局文件是用来和Fragment绑定的,相当于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:background="#000000"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="我是Fragment的布局文件,我是黑色"
        android:textColor="#ffffff" />

</LinearLayout>

步骤二:创建一个类继承Fragment

步骤三:在继承了Fragment的类中重写onCreateView方法

步骤四:在onCreateView方法中将布局文件和Fragment绑定

package com.contentprovide.liuliu.fragment_test;

import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by liuliu on 2018/6/5.
 * <p>
 * 静态加载Fragment步骤:
 * 1、创建一个类继承Fragment(一般导包是app中的Fragment)
 * 2、重写onCreateView方法
 * 3、创建一个布局文件,充当Fragment的视图
 * 4、在onCreateView方法中将布局文件和Fragment绑定
 */

public class static_Frag extends Fragment {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.static_layout, null);

        return view;
    }

}

这四步完成了那么一个具有视图效果的Fragment就完成了没接下来就可以直接在Activity中的布局文件中引用了

步骤五:在Activity中的布局文件中引用Fragment

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorAccent"
    android:orientation="vertical"
    tools:context="com.contentprovide.liuliu.fragment_test.MainActivity">

    <fragment
        android:id="@+id/one_frag"
        android:name="com.contentprovide.liuliu.fragment_test.static_Frag"
        android:layout_width="match_parent"
        android:layout_height="300px"
        android:layout_marginTop="200px" />

</LinearLayout>

在步骤五中有个需要注意的地方,引用fragment时一定要给定一个id,否则会运行是会报错的

到这里Fragment的静态引用就结束了,可以运行看看效果:

优点:1、可以在Activity中直接绑定并且控制Fragment布局中的控件,这点对于初步使用是很方便的

   2、把Fragment当成控件使用,也很方便上手

缺点:不能根据业务逻辑动态加载Fragment

静态使用Fragment虽然很简单但是很多时候没办法达到使用要求,动态使用就可以比较灵活,下面是动态使用Fragment的方法:

步骤一:我们先创建好几个Fragment,我这里创建了四个Fragment,每个Fragment都绑定了相对应的布局

步骤二:在Activity的布局文件中定义一个FrameLayout布局,主要是用来灵活的存放不同的Fragment,我下面的布局除了FrameLayout还另外定义了四个按钮用来切换不同的FrameLayout,就像微信的界面一样,其实这个实现效果和TabHost是一样的,可以取代之前用的Tabhost

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    android:gravity="center"
    tools:context="com.contentprovide.liuliu.fragment_test2.MainActivity">

<FrameLayout
    android:id="@+id/frag"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    />

  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:orientation="horizontal"
      android:gravity="center"
      android:background="@color/colorAccent"
      >

      <Button
          android:id="@+id/btn_one"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_weight="1"
          android:text="界面一"
          />
      <Button
          android:id="@+id/btn_two"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_weight="1"
          android:text="界面二"
          />
      <Button
          android:id="@+id/btn_three"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_weight="1"
          android:text="界面三"
          />
      <Button
          android:id="@+id/btn_four"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_weight="1"
          android:text="界面四"
          />

  </LinearLayout>

</LinearLayout>

步骤三:接下来就可以在Activity中灵活的将Fragment放进FrameLayout中了

package com.contentprovide.liuliu.fragment_test2;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements View.OnClickListener {

    Button btn_one, btn_two, btn_three, btn_four;

    FragmentManager fragmentManager;
    FragmentTransaction fragmentTransaction;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();

//        获取碎片管理者
        fragmentManager = getFragmentManager();
//        获取碎片事物
        fragmentTransaction = fragmentManager.beginTransaction();
//        设置初始的Fragment
        fragmentTransaction.replace(R.id.frag, new one());
        fragmentTransaction.commit();

    }

    public void init() {
        btn_one = (Button) findViewById(R.id.btn_one);
        btn_two = (Button) findViewById(R.id.btn_two);
        btn_three = (Button) findViewById(R.id.btn_three);
        btn_four = (Button) findViewById(R.id.btn_four);

        btn_one.setOnClickListener(this);
        btn_two.setOnClickListener(this);
        btn_three.setOnClickListener(this);
        btn_four.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
//        获取碎片管理者
        fragmentManager = getFragmentManager();
//        获取碎片事物
        fragmentTransaction = fragmentManager.beginTransaction();

        switch (view.getId()) {
            case R.id.btn_one:
                fragmentTransaction.replace(R.id.frag, new one());
                break;
            case R.id.btn_two:
                fragmentTransaction.replace(R.id.frag, new two());
                break;
            case R.id.btn_three:
                fragmentTransaction.replace(R.id.frag, new three());
                break;
            case R.id.btn_four:
                fragmentTransaction.replace(R.id.frag, new four());
                break;
        }
        fragmentTransaction.commit();
    }

}

实现效果:

下面是几个会用到的方法:

transaction.add()

往Activity中添加一个Fragment

transaction.remove()

从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。

transaction.replace()

使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~

transaction.hide()

隐藏当前的Fragment,仅仅是设为不可见,并不会销毁

transaction.show()

显示之前隐藏的Fragment

detach()

会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。

attach()

重建view视图,附加到UI上并显示。

transatcion.commit()

提交一个事务

原文地址:https://www.cnblogs.com/lyd447113735/p/9141607.html

时间: 2024-12-14 20:40:12

Android碎片:Fragment的相关文章

Android碎片Fragment总结

一.Fragment的相关概念 (一)Fragment的基础知识 Fragment是Android3.0新增的概念,中文意思是碎片,它与Activity十分相似,用来在一个 Activity中描述一些行为或一部分用户界面.使用多个Fragment可以在一个单独的Activity中建 立多个UI面板,也可以在多个Activity中使用Fragment. Fragment拥有自己的生命 周期和接收.处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了.更为 重要的是,你可以动态的

android学习八(android碎片fragment的使用)

碎片(Fragment)是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用屏幕的空间.首先建立一个平板的模拟器1034*600,环境使用android4.2.2.在建立一个android的项目,项目名为FragmentTest. 碎片的简单使用 新建一个左侧碎片布局left_fragment.xml代码如下 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr

Android开发:碎片Fragment完全解析fragment_main.xml/activity_main.xml

Android开发:碎片Fragment完全解析 为了让界面可以在平板上更好地展示,Android在3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像 Activity一样包含布局.Fragment通常是嵌套在Activity中使用的,现在想象这种场景:有两个 Fragment,Fragment 1包含了一个ListView,每行显示一本书的标题.Fragment 2包含了TextView和 ImageView,来显示书的详细内容和图片. AD:51CTO学院:I

Android 关于ViewPager结合碎片Fragment的简单使用

一.      首先在xml添加ViewPager控件 我们希望每个viewpager显示一张图片 新建一个pager_item.xml的文件 代码如下 二.分析   一个ViewPager需要设置一个适配器,这个适配器可以继承FragmentStatePagerAdapter, 适配器同样需要设置数据,这个为适配器添加的是碎片.碎片可以继承Fragment,设置视图,监听等,具体图如下: 三.    上图可知,我们需要新建一个碎片先. 注意,这个继承的Fragment需要是在包android.

Android之碎片Fragment

Fragment是个特别的存在,有点像报纸上的专栏,看起来只占据页面的一小块,但是这一小块有自己的生命周期,可以自行其是,仿佛独立王国,并且这一小块的特性无论在哪个页面,给一个位置就行,添加以后不影响宿主页面的其他区域,去除后也不影响宿主页面的其他区域.每个fragment都有自己的布局文件,依据其使用方式可分为静态注册和动态注册两种,静态注册是在布局文件中直接放置fragment节点,类似于一个普通控件,可被多个布局文件同时引用.静态注册一般用于某个通用的页面部件(如logo条,广告条等),每

android基础----&gt;Fragment的使用

碎片(Fragment)是一种可以嵌入在活动当中的UI 片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用的非常广泛. Fragment的基础例子 一.增加Fragment,another_right_fragment.xml文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"

android 63 Fragment

#Fragment 是3.0平板才引入进来的,3.0之后就加入了Fragment.原来是一个屏幕就是一个Activity,>片段,碎片 1. 定义某一个片段的界面 继承Fragment类 public class BlueToothFragment extends Fragment {} 2. 重写Fragment里面的方法 显示Fragment的ui,把布局文件转化成view对象 public View onCreateView(LayoutInflater inflater, ViewGro

Android中Fragment与Activity之间的交互(两种实现方式)

(未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如何创建Fragment混合布局做了详细的分析,今天就来详细说道说道Fragment与宿主Activity之间是如何实现数据交互的. 我们可以这样理解,宿主Activity中的Fragment之间要实现信息交互,就必须通过宿主Activity,Fragment之间是不可能直接实现信息交互的. Fragment与

Android之Fragment优点

什么是Fragment 自从Android 3.0中引入fragments 的概念,根据词海的翻译可以译为:碎片.片段.其目的是为了解决不同屏幕分辩率的动态和灵活UI设计.大屏幕如平板小屏幕如手机,平板电脑的设计使得其有更多的空间来放更多的UI组件,而多出来的空间存放UI使其会产生更多的交互,从而诞生了fragments . fragments 的设计不需要你来亲自管理view hierarchy 的复杂变化,通过将Activity 的布局分散到frament 中,可以在运行时修改activit