Android 动态fragment、fragment添加到栈管理、activity与fragment的bundle通信

fragment的介绍请点这里

一 案例:点击不同的按钮动态切换不同的fragment页面

案例效果图

 步骤

step1 创建3个fragment备用
step2 main.xml写3个按钮布局
step3 main.java
  

   1 按钮点击事件的新写法
        main.java实现View.OnClickListener
        btn.setOnClickListener(this);
        重写onClick方法
    2 点击事件:动态切换fragment
        //专门管理fragment的
        FragmentManager fragmentManager = getSupportFragmentManager();
        //开启事务
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        //用第2个参数替换第1个
        transaction.replace(R.id.framelayout,fragment);
        //提交事务
        transaction.commit();
    3 一个点击事件,根据不同的button,切换不同的的fragment

代码

step1 创建3个fragment备用

把fragment的java文件这里的代码删掉,否则后期会报错

 step2 main.xml写3个按钮布局

activity_main.xml

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp">
        <Button
            android:text="button1"
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <Button
            android:text="button2"
            android:id="@+id/btn2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <Button
            android:text="button3"
            android:id="@+id/btn3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>

    <FrameLayout
        android:id="@+id/framelayout"
        android:alpha="0.7"
        android:background="@drawable/big"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>

</LinearLayout>

step3 MainActivity.java

package com.example.myfragmentdong;

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{

    private Button btn;
    private Button btn2;
    private Button btn3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = findViewById(R.id.btn);
        btn.setOnClickListener(this);
        btn2 = findViewById(R.id.btn2);
        btn2.setOnClickListener(this);
        btn3 = findViewById(R.id.btn3);
        btn3.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        switch(view.getId()){
            case R.id.btn:
                replacefragement(new BlankFragment1());
                break;
            case R.id.btn2:
                replacefragement(new BlankFragment2());
                break;
            case R.id.btn3:
                replacefragement(new ItemFragment());
                break;
        }

    }

    //动态切换fragment
    private void replacefragement(Fragment fragment) {
        //专门管理fragment的
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        //用第2个替换第一个
        transaction.replace(R.id.framelayout,fragment);
        //提交事务
        transaction.commit();
    }
}

效果

 

 

二 fragment添加栈

//添加栈
        transaction.addToBackStack(null);

 添加栈前的效果

动态fragment效果

 添加栈后的效果

fragment栈后

说明:添加到栈后 返回退出时会一步步退出,不是直接退出.

三 activity与fragment的通信

原生通信:bundle

案例:activity把信息发给fragment


步骤:
1 Main.java:
    new一个Bundle,putString,fragment来setArguments(bundle)
2 Fragment.java:
    onCreate方法里 getArguments().getString("key")

代码

MainActivity.java

//通信:activity把信息发给fragment
Bundle bundle = new Bundle();
bundle.putString("message","i love android");
BlankFragment1 fragment1 = new BlankFragment1();
fragment1.setArguments(bundle);

BlankFragment1.java


@Override
    public void onCreate(Bundle savedInstanceState) {
        //获取 bundle
        Bundle bundle = getArguments();
        Log.e("cs","信息是:"+ bundle.getString("message"));
        super.onCreate(savedInstanceState);

    }

效果

activity和fragment通过接口通信的实现方法请点这里

猜你喜欢

转载自blog.csdn.net/m0_45877477/article/details/125083329#comments_21752682