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();
            }
        });
    }
}

四、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 ); 

 
发布了49 篇原创文章 · 获赞 2 · 访问量 8595

猜你喜欢

转载自blog.csdn.net/yangjunjin/article/details/104716412
今日推荐