Android学习|Fragment

Android学习|Fragment,第1张

Android学习|Fragment__01 一、什么是Fragment二、 静态态添加Fragment三、动态添加Fragment

一、什么是Fragment

           Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑, 当然现在他仍然是平板APP UI设计的宠儿,而且我们普通手机开发也会加入这个Fragment, 我们可以把他看成一个小型的Activity,又称Activity片段!想想,如果一个很大的界面,我们 就一个布局,写起界面来会有多麻烦,而且如果组件多的话是管理起来也很麻烦!而使用Fragment 我们可以把屏幕划分成几块,然后进行分组,进行一个模块化的管理!从而可以更加方便的在 运行过程中动态地更新Activity的用户界面!另外Fragment并不能单独使用,他需要嵌套在Activity 中使用,尽管他拥有自己的生命周期,但是还是会受到宿主Activity的生命周期的影响,比如Activity 被destory销毁了,他也会跟着销毁!

Fragment的特征

1、具备生命周期
Fragment有生命周期,那么在一个activity可以使用多个Fragment,或者一个Fragment在多个activity 中重复使用,来完成一些效果

2、必须委托在activity中才能运行
则一个activity暂停,其中包含的所有的Framgment都会暂停



二、 静态态添加Fragment

静态态添加Fragment:一个activity包含那几个fragment提前设置好。


实现:

android studio中通过下图方式创建fragment
创建后同时也会在res/layout下创建一个xml文件,与创建的java类绑定。

xml文件中可以自定义一些组件,如下。


<FrameLayout 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"
    tools:context=".BlankFragment1">


    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="30dp"/>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:text="Button" />
FrameLayout>

然后在创建的Java类中,其继承了Fragment,重写了许多方法,这块我们只对onCreateView()进行改变。(onCreateView():fragment的view视图在被创建时的动作)

package com.example.fifthdemo_framgent_01;

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;


public class BlankFragment1 extends Fragment {


    private View root;
    private TextView textView;
    private Button button;

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

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (root == null) {
            root = inflater.inflate(R.layout.fragment_blank1, container, false);
        }

        textView = root.findViewById(R.id.textView);
        button = root.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                textView.setText("button setOnClickListener");
            }
        });

        return root;
    }
}

此时,准备工作已经完成。接下来进行fragment的使用。
在要使用的界面(activity_main.xml)中设置如下代码。


<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:orientation="vertical"
    tools:context=".MainActivity">

    
    <fragment
        android:id="@+id/fragment1"
        android:name="com.example.fifthdemo_framgent_01.BlankFragment1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

    <fragment
        android:id="@+id/fragment2"
        android:name="com.example.fifthdemo_framgent_01.BlankFragment2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"/>


LinearLayout>

        在fragment标签中,name为与java创建的Fragment进行绑定。id必须设置,因为资源管理会使用。

        (一个avtivity可以包含多个fragment:上面的BlankFragment2为BlankFragment1,直接复制粘贴)


效果如下:



三、动态添加Fragment

主要包含以下步骤:
(1)、 创建一个待处理的fragment
(2)、获取FragmentManager,一般都是通过getSupportFragmentManager()
(3)、开启一个事务transaction,一般调用fragmentManager的beginTransaction()
(4)、使用transaction进行fragment的替换 。 一般调用replace()
(5)、提交事务。调用commit()

演示
首先activity_main.xml中添加两个按钮,用于替换事件触发,然后添加一个布局,用来放置Fragment


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/bt1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="add fragment" />

    <Button
        android:id="@+id/bt2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="repalce" />

    <FrameLayout
        android:id="@+id/framelayout_1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#A68EA3"/>

LinearLayout>

然后创建两个Fragment,用于切换模拟。(这块我创建的是BlankFragment和ItemFragment2)
接着Java代码对两个按钮的点击事件设置。

package com.example.fifthdemo_fragment_02;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

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

        Button button1 = findViewById(R.id.bt1);
        button1.setOnClickListener(this);

        Button button2 = findViewById(R.id.bt2);
        button2.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {   //点击事件
        switch (view.getId()) {
            case R.id.bt1:  replaceFragment(new BlankFragment1());
                            break;
            case R.id.bt2:  replaceFragment(new ItemFragment2());
                            break;
        }
    }

    private void replaceFragment(Fragment fragment) {
        //获取Fragment的管理器类 FragmentManager
        FragmentManager fragmentManager = getSupportFragmentManager();
        //获取 FragmentManager中用于 Fragment 替换之类的类 FragmentTransaction
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        //创建一个替换Fragment的事件
        transaction.replace(R.id.framelayout_1,fragment);   // 替换的是framelayout_1中的fragment
        //将新的Fragment对象压入一个栈内,点击back会进行回退,而非退出app
        transaction.addToBackStack(null);
        //提交事件
        transaction.commit();
    }
}

代码解释:

这块主MainActivity类实现了View.OnClickListene接口,重写onClick()作为点击事件的监听,这块设置点击id=bt1的按钮后,执行replaceFragment(),页面替换为创建的BlankFragment,另一个switch-case相同。

然后在replaceFragment(),Fragment的切换需要Fragment的管理器类 FragmentManager,进行获取

/获取Fragment的管理器类 FragmentManager
FragmentManager fragmentManager = getSupportFragmentManager();

FragmentManager中用于 Fragment 替换之类的类为 FragmentTransaction,进行获取

FragmentTransaction transaction = fragmentManager.beginTransaction();

进行页面切换,依靠FragmentTransaction 的replace()、commit()两个方法。

//创建一个替换Fragment的事件
transaction.replace(R.id.framelayout_1,fragment); // 替换的是framelayout_1中的fragment
//提交事件
transaction.commit();

ps:页面在进行切换后,点安卓机的back键,会直接回退到桌面。要想实现回到上一个Fragment,可在FragmentTransaction 事件提交前插入以下代码:

//将新的Fragment对象压入一个栈内,点击back会进行回退,而非退出app
transaction.addToBackStack(null);



效果:
刚启动时,没有Fragment添加进来

点击 add fragment后,添加了BlankFragment

再点击replace,添加了ItemFragment,替换了BlankFragment

点击back,当前Fragment出栈,会回退到上一个BlankFragment,而非回到桌面

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存