欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 之fragment(静态使用)

程序员文章站 2022-06-08 18:42:25
...

1.Fragment介绍

Fragment可以解决App同时适应手机和平板 布局 的问题。

Fragment当成Activity的一个界面的一个组成部分,Activity的界面也可以由不同的Fragment组成,

Fragment拥有自己的生命周期和接收、处理用户的事件,于是我们就不必在Activity里面写一堆控件的事件处理的代码

更重要的是,我们可以动态的添加,替换和移除某个Fragment。

简单来说,Fragment其实可以理解为一个具有自己生命周期的控件,只不过这个控件又有点特殊,它有自己的处理输入事件的能力,有自己的生命周期,又必须依赖于Activity,能互相通信和托管。

2.Fragment生命周期

Android 之fragment(静态使用)

可以看到Fragment比Activity多了几个额外的生命周期回调方法:

onAttach(Activity)

当Fragment与Activity发生关联时调用。

onCreateView(LayoutInflater, ViewGroup,Bundle)

创建该Fragment的视图

onActivityCreated(Bundle)

当Activity的onCreate方法返回时调用

onDestoryView()

与onCreateView想对应,当该Fragment的视图被移除时调用

onDetach()

与onAttach相对应,当Fragment与Activity关联被取消时调用

注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现。

3.Fragment的使用

静态使用Fragment,这是Fragment最简单的一种方式,把fragment当成普通的控件,直接写在Activity的布局文件中。

步骤:

1、继承Fragment,重写onCreateView决定Fragemnt的布局

2、在Activity中声明此Fragment,就当和普通的View一样

例子:(使用2Fragment作为Activity的布局,一个Fragment用于标题布局,一个Fragment用于内容布局

<---我们先看下效果吧--->

Android 之fragment(静态使用)

fragment_title的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#00cef7">
    <ImageView
        android:id="@+id/iv_back"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@mipmap/back"/>
    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="标题"
        android:textSize="20sp"
        android:textStyle="bold"/>

</LinearLayout>

TitleFragment.java:

package com.ied.fragmentproject;

import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;

/**
 * Created by DELL on 2018/4/6.
 */

public class TitleFragment extends Fragment {
    private ImageView ivBack;

    //当创建fragment视图时调用
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        //加载片段的视图
        /**
         * 参数说明:
         * 参数1:layout资源的ID
         * 参数2:存放fragment的layout的ViewGroup
         * 参数3:布尔型数据,表示是否在创建fragment的layout期间,把layout附加到container上(因为系统已把layout插入到
         * container中了,所以值为false,如果为true会导致在最终的layout中创建多余的viewgroup).
         */
        View view = inflater.inflate(R.layout.fragment_title,container,false);
        //对视图中的控件进行初始化
        ivBack = view.findViewById(R.id.iv_back);
        ivBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //通过getActivity()获取上下文环境对象
                Toast.makeText(getActivity(),"您点击了fragment_title里的ImageView按钮!!",Toast.LENGTH_SHORT).show();
            }
        });
        return view;
    }
}

同理fragment_content的布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/tv_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="使用Fragment做主面板!"
        android:textSize="20sp"
        android:textStyle="bold"/>
</LinearLayout>

ContentFragment.java:

package com.ied.fragmentproject;

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;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Created by DELL on 2018/4/6.
 */

public class ContentFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_content,container,false);
        return view;
    }
}
MainActivity.java:
package com.ied.fragmentproject;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

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

activity_info主界面的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--android:name  连接java TitleFragment里面的代码
                      java里面的代码连接fragment_title页面-->
    <fragment
        android:id="@+id/fragment_title"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:name="com.ied.fragmentproject.TitleFragment"/>
    <fragment
        android:id="@+id/fragment_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.ied.fragmentproject.ContentFragment"
        />
</LinearLayout>
activity同fragment的通信

案例:点击activity里面的控件,修改ContentFragment里面控件的内容
步骤1:在activity的布局文件中增加控件,如下:

Android 之fragment(静态使用)

具体代码:

<TextView
        android:id="@+id/tv_modify"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点击修改fragment_content里面的文本信息!"/>
步骤2:ContentFragment中增加修改控件内容的逻辑:
Android 之fragment(静态使用)

具体代码:

   /**
     * activity和fragment通信的步骤1:自定义方法修改fragment里面的控件信息
     * @param info
     */
    public void modifyText(String info){
        tvContent.setText(info);
    }
步骤3:在activity增加修改控件内容的逻辑:
Android 之fragment(静态使用)
具体代码:
        tvModify = (TextView) findViewById(R.id.tv_modify);
        tvModify.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //修改fragment_content里面的文本信息的逻辑
                //getFragmentManager()获取fragment的管理器
                //findFragmentById 通过id查找activity布局文件中的fragment
                //activity和fragment通信的步骤2:对fragment进行初始化
                ContentFragment contentFragment= (ContentFragment) getFragmentManager().findFragmentById(R.id.fragment_content);
                //activity和fragment通信的步骤3:通过调用ContentFragment中的方法实现修改内容的功能。
                contentFragment.modifyText("activity传递过去的内容");
            }
        });

效果:

Android 之fragment(静态使用)

源代码下载

密码: 4sp9