Android Fragment使用事项

总结:

1、add覆盖原fragment, 添加入一个新fragment后, 原来的fragment仍然存活

2、replace 是先remove掉相同id的所有fragment,然后在add当前的这个fragment

从性能出发, 推荐使用replace(有疑问,再研究下

1、add、replace,不管是否添加addToBackStack,都要走一遍fragment 的周期;

2、FragmentA和FragmentB 进行切换 replace同一个fragment是不会走生命周期。

3、FragmentA和FragmentB 进行切换 replace不添加addToBackStack,每次都把当前的fragment进行销毁,然后添加新的fragment,走全部的生命周期。

4、FragmentA和FragmentB 进行切换 replace添加addToBackStack,不会销毁当前的fragment。

一、生命周期

二、add、replace、show、hide方法的区别

add方法的调用

 getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment, homeFragmentA)
                .commit();

replace方法的调用 

        getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment, homeFragmentA)
                .commit();

add、replace,不管是否添加addToBackStack,日志都是如下: 

 com.heima.mynewdemo E/HomeFragmentA====: onAttach
 com.heima.mynewdemo E/HomeFragmentA====: onCreate
 com.heima.mynewdemo E/HomeFragmentA====: onCreateView
 com.heima.mynewdemo E/HomeFragmentA====: onActivityCreated
 com.heima.mynewdemo E/HomeFragmentA====: onStart
 com.heima.mynewdemo E/HomeFragmentA====: onResume
 com.heima.mynewdemo E/HomeFragmentA====: onPause
 com.heima.mynewdemo E/HomeFragmentA====: onStop
 com.heima.mynewdemo E/HomeFragmentA====: onDestroyView
 com.heima.mynewdemo E/HomeFragmentA====: onDestroy
 com.heima.mynewdemo E/HomeFragmentA====: onDetach

使用replace对homeFragmentA、homeFragmentB进行切换:

1、replace同一个fragment是不会走生命周期。

2、使用replace进行切换

        homeFragmentA = new HomeFragmentA();
        homeFragmentB = new HomeFragmentB();

        getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment, homeFragmentA)
                .commit();

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "添加", Toast.LENGTH_SHORT).show();
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.fragment, homeFragmentA, "homeFragment")
                        .commit();

            }
        });
        findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.fragment, homeFragmentB)
                        .commit();
            }
        });
    }

日志如下: 

2020-03-26 09:17:18.620 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onAttach
2020-03-26 09:17:18.620 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onCreate
2020-03-26 09:17:18.621 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onCreateView
2020-03-26 09:17:18.622 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onActivityCreated
2020-03-26 09:17:18.622 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onStart
2020-03-26 09:17:18.623 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onResume
2020-03-26 09:17:25.818 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onAttach
2020-03-26 09:17:25.818 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onCreate
2020-03-26 09:17:25.819 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onPause
2020-03-26 09:17:25.819 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onStop
2020-03-26 09:17:25.819 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onDestroyView
2020-03-26 09:17:25.821 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onDestroy
2020-03-26 09:17:25.821 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onDetach
2020-03-26 09:17:25.823 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onCreateView
2020-03-26 09:17:25.823 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onActivityCreated
2020-03-26 09:17:25.823 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onStart
2020-03-26 09:17:25.823 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onResume
2020-03-26 09:17:34.905 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onAttach
2020-03-26 09:17:34.905 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onCreate
2020-03-26 09:17:34.906 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onPause
2020-03-26 09:17:34.906 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onStop
2020-03-26 09:17:34.906 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onDestroyView
2020-03-26 09:17:34.907 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onDestroy
2020-03-26 09:17:34.907 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onDetach
2020-03-26 09:17:34.914 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onCreateView
2020-03-26 09:17:34.914 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onActivityCreated
2020-03-26 09:17:34.914 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onStart
2020-03-26 09:17:34.914 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onResume

总结:每次都把当前的fragment进行销毁,然后添加新的fragment,走全部的生命周期: 

3、 加入addToBackStack

        homeFragmentA = new HomeFragmentA();
        homeFragmentB = new HomeFragmentB();

        getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment, homeFragmentA)
                .addToBackStack(null)
                .commit();

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "添加", Toast.LENGTH_SHORT).show();
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.fragment, homeFragmentA, "homeFragment")
                        .addToBackStack(null)
                        .commit();

            }
        });
        findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.fragment, homeFragmentB)
                        .addToBackStack(null)
                        .commit();
            }
        });
    }

日志如下: 

2020-03-26 09:22:53.012 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onAttach
2020-03-26 09:22:53.012 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onCreate
2020-03-26 09:22:53.013 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onCreateView
2020-03-26 09:22:53.014 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onActivityCreated
2020-03-26 09:22:53.014 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onStart
2020-03-26 09:22:53.015 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onResume
2020-03-26 09:23:10.081 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onAttach
2020-03-26 09:23:10.081 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onCreate
2020-03-26 09:23:10.081 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onPause
2020-03-26 09:23:10.082 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onStop
2020-03-26 09:23:10.082 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onDestroyView
2020-03-26 09:23:10.085 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onCreateView
2020-03-26 09:23:10.085 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onActivityCreated
2020-03-26 09:23:10.085 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onStart
2020-03-26 09:23:10.085 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onResume
2020-03-26 09:23:44.288 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onPause
2020-03-26 09:23:44.288 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onStop
2020-03-26 09:23:44.288 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onDestroyView
2020-03-26 09:23:44.290 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onCreateView
2020-03-26 09:23:44.291 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onActivityCreated
2020-03-26 09:23:44.291 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onStart
2020-03-26 09:23:44.291 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onResume

总结: 已经创建的fragment不会销毁;

4、使用add、配合hide、show使用


        homeFragmentA = new HomeFragmentA();
        homeFragmentB = new HomeFragmentB();
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment, homeFragmentA)
                .add(R.id.fragment, homeFragmentB)
                .show(homeFragmentA)
                .hide(homeFragmentB)
//                .addToBackStack(null)
                .commit();

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "添加A", Toast.LENGTH_SHORT).show();
                getSupportFragmentManager().beginTransaction()
                        .show(homeFragmentA)
                        .hide(homeFragmentB)
//                        .addToBackStack(null)
                        .commit();

            }
        });
        findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "添加B", Toast.LENGTH_SHORT).show();
                getSupportFragmentManager().beginTransaction()
                        .show(homeFragmentB)
                        .hide(homeFragmentA)
//                        .addToBackStack(null)
                        .commit();
            }
        });
    }

日志如下:

2020-03-26 09:42:58.790 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onAttach
2020-03-26 09:42:58.790 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onCreate
2020-03-26 09:42:58.791 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onAttach
2020-03-26 09:42:58.791 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onCreate
2020-03-26 09:42:58.792 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onCreateView
2020-03-26 09:42:58.792 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onActivityCreated
2020-03-26 09:42:58.793 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onCreateView
2020-03-26 09:42:58.793 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onActivityCreated
2020-03-26 09:42:58.793 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onStart
2020-03-26 09:42:58.793 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onStart
2020-03-26 09:42:58.795 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onResume
2020-03-26 09:42:58.795 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onResume
2020-03-26 09:43:05.875 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onPause
2020-03-26 09:43:05.875 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onPause
2020-03-26 09:43:06.315 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onStop
2020-03-26 09:43:06.316 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onStop
2020-03-26 09:43:06.317 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onDestroyView
2020-03-26 09:43:06.318 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onDestroy
2020-03-26 09:43:06.318 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onDetach
2020-03-26 09:43:06.319 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onDestroyView
2020-03-26 09:43:06.319 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onDestroy
2020-03-26 09:43:06.319 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onDetach

三、Fragment的基本使用

1、AndroidX中Fragment使用的注意事项,Activity 必须继承AppCompatActivity,使用getSupportFragmentManager()

2、Android中Fragment使用的注意事项,Activity 必须继承Activity,使用getFragmentManager()

package com.heima.googledemo;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

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


public class MainActivity extends AppCompatActivity {
    private ImageView image;
    private TextView text;

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

        text = findViewById(R.id.text);
        text.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
        //Android
        getFragmentManager().beginTransaction()
                .add(R.id.fragment_container, homeFragment)
                .add(R.id.fragment_container, homeFragmentB)
                .show(homeFragment)
                .hide(homeFragmentB)
                .addToBackStack(null)
                .commit();


        //AndroidX
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment, homeFragment)
                .add(R.id.fragment, homeFragmentB)
                .show(homeFragment)
                .hide(homeFragmentB)
                .addToBackStack(null)
                .commit();
            }
        });
    }
}

replace 加动画切换 

getChildFragmentManager().beginTransaction()
         .setCustomAnimations(
                            R.anim.slide_left_in,
                            R.anim.slide_right_out,
                            R.anim.slide_right_in,
                            R.anim.slide_left_out)
                    .replace(R.id.fragmentId, fragment2)
                    .commit();
slide_left_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:fromXDelta="-100%p"
        android:toXDelta="0%p"
        android:duration="300"/>

    <alpha
        android:fromAlpha="0.5"
        android:toAlpha="1.0"
        android:duration="100"/>
</set>
slide_right_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="0%p"
        android:toXDelta="100%p"
        android:duration="300"/>

    <alpha
        android:fromAlpha="1.0"
        android:toAlpha="0.5"
        android:duration="200"/>
</set>
slide_right_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="100%p"
        android:toXDelta="0%p"
        android:duration="300"/>

    <alpha
        android:fromAlpha="0.5"
        android:toAlpha="1.0"
        android:duration="200"/>
</set>
slide_left_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:fromXDelta="0%p"
        android:toXDelta="-100%p"
        android:duration="300"/>

    <alpha
        android:fromAlpha="1.0"
        android:toAlpha="0.5"
        android:duration="200"/>
</set>

四、Fragment与Activity 通信

1、在Fragment获取Activity中的View

View view = getActivity().findViewById(R.id.text)

2、同样,您的Activity也可使用findFragmentById()findFragmentByTag(),通过从FragmentManager获取对Fragment的引用来调用片段中的方法。或者使用new 的对象进行方法的调用,例如:

 ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager (). findFragmentById ( R . id .example_fragment ); 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Fragment 是一种可重用的界面部件,它可以独立于 Activity 运行并与其他 Fragment 组合在一起形成一个完整的界面。Fragment 可以在不同的 Activity 之间共享,这样可以减少代码重复并提高代码复用率。使用 Fragment 需要继承 Fragment 类并重写 onCreateView 方法来创建界面。然后使用 FragmentManagerFragmentTransaction 来动态添加、移除和替换 Fragment。 ### 回答2: Android FragmentAndroid 应用的一种重要的组件,它是一种可以嵌入到 Activity 的可重用 UI 组件。一个 Activity 可以包含多个 Fragment,一个 Fragment 可以被多个 Activity 包含。 使用 Fragment,可以实现 UI 动态加载、数据隔离、模块化开发。在实现不同分辨率、屏幕模式的支持时,Fragment 提供了更方便的管理方式。 Fragment 生命周期包括以下几个状态: 1. 初始化阶段:调用 onCreate 方法; 2. 可视阶段:调用 onCreateView 方法,创建 Fragment 的 view; 3. 已添加到 Activity :调用 onActivityCreated 方法; 4. 可交互阶段:调用 onStart 方法,Fragment 可以与用户进行交互; 5. 在前台阶段:调用 onResume 方法; 6. 可离屏阶段:调用 onPause 方法; 7. 完全不可见阶段:调用 onStop 方法; 8. 销毁阶段:调用 onDestroyView 方法、onDestroy 方法、onDetach 方法。 在使用 Fragment 的过程,我们需要了解以下几个常用的类: 1. FragmentFragment 的基础类,需要重载多个生命周期方法; 2. FragmentManager: 管理 Fragment 的类,包括 Fragment 的添加、移除、替换、显示、隐藏等操作; 3. FragmentTransaction: Fragment 操作类,封装了一组可以在 FragmentManager 上执行的操作。 在使用 Fragment 的时候,一般需要实现以下步骤: 1. 在 Activity 定义一个容器,用于存放 Fragment 对象; 2. 创建 Fragment 对象; 3. 将 Fragment 对象添加到容器; 4. 在 Fragment 定义 UI 和数据绑定等处理。 例如,我们可以在 Activity 定义一个容器,然后通过 FragmentManager 创建一个 Fragment 对象,并将其添加到容器: ``` FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); MyFragment myFragment = new MyFragment(); transaction.add(R.id.container, myFragment); transaction.commit(); ``` 在 Fragment ,我们可以定义 UI 并进行数据绑定: ``` public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_my, container, false); TextView textView = view.findViewById(R.id.text_view); textView.setText("Hello Fragment"); return view; } } ``` 这样,我们就可以在 Activity 加载 Fragment,并在 Fragment 显示 UI 和数据信息。 总而言之,使用 Android Fragment 可以使我们更好地进行模块化开发、实现 UI 动态加载、数据隔离、屏幕适配等功能。同时,在开发过程,需要熟悉 Fragment 的生命周期及常用类的使用方法,才能更加高效地进行开发。 ### 回答3: Android Fragment(片段)是Android开发一个重要的概念,它可以轻松地将一个Activity划分为多个子部分,每个部分可以独立地进行操作。正因为如此,Fragment成为了很多应用开发的标配。 Fragment适用于动态UI、动态加载和给大屏幕设备提供一个更加灵活的界面。Fragment可以被看做是Activity的一个小模块,可实现模块化编程,当然Fragment的生命周期也不同于Activity,系统对它的管理也是不同的。 切割UI界面为小块(模块),实现模块化程度,Fragment使用可以提供更好的用户界面体验。例如,在平板电脑列表在右边,详细视图在左边,而在普通手机这个列表是单独呈现的,这时候使用Fragment就可以轻易地划分页面布局,做到简洁协调。 为了使用Fragment,首先需要了解一些重要的概念: Fragment的生命周期:与Activity的生命周期相似,包括onCreate()、onStart()、onResume()、onPause()、onStop()和onDestroy()等方法。 Fragment管理:Android提供了FragmentManagerFragmentTransaction两个类来管理Fragment的添加、删除、替换等等操作。需要注意的是,Fragment的管理和Activity的管理是有区别的。 使用Fragment时,还需要注意以下几点: 1. Fragment 的激活必须通过 FragmentTransaction 的commit() 函数实现,否则不会被添加到 FragmentManager。 2. 通过使用layout创建一个包含 Fragment 的Activity布局,再通过 FragmentManager 加载相应的 Fragment,通过这种方式可以实现 Fragment 管理和Fragment 之间的通讯。 3. Fragment 可以嵌套使用,即一个 Fragment可以只是另一个 Fragment的一部分,这种设计可以更好的重用代码和布局。 总之,Android Fragment使用为应用程序开发带来了很多好处。它可以提高程序的灵活性和可扩展性,有助于构建清晰的UI体系结构,并支持模块化编程。使用Fragment的开发者可以通过Activity、Fragment和它们之间的通信来创建更加动态、灵活和易于维护的Android应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值