一 案例:点击不同的按钮动态切换不同的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);
}
效果