Fragment系列:使用FrameLayout动态加载

Posted zhangjin1120

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fragment系列:使用FrameLayout动态加载相关的知识,希望对你有一定的参考价值。

目录

1. 动态加载的完整代码实现

上一篇写了:使用<fragment>标签静态加载Fragment,继续把动态加载也写完。
下图的绿色部分就是一个Fragment:

核心代码:

        ShowNameFragment mFragment = ShowNameFragment.newInstance("zj", "hubei");
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction =manager.beginTransaction();
        fragmentTransaction.replace(R.id.framelayout,mFragment);
        fragmentTransaction.commit();
        
		//简写
        ShowNameFragment mFragment = ShowNameFragment.newInstance("zj", "hubei");
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.framelayout, mFragment)
                .commit();
   

具体实现:

MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ShowNameFragment mFragment = ShowNameFragment.newInstance("zj", "hubei");
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction =manager.beginTransaction();
        fragmentTransaction.replace(R.id.framelayout,mFragment);
        fragmentTransaction.commit();
    

activity_main.xml

注意添加id

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:id="@+id/framelayout"
    tools:context=".MainActivity">
</FrameLayout>

ShowNameFragment.java

注意:newInstance()是Android studio默认添加的

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ShowNameFragment extends Fragment 

    private static final String NAME = "name";
    private static final String PROVINCE = "province";


    private String mName;
    private String mProvince;

    public ShowNameFragment() 
    


    public static ShowNameFragment newInstance(String param1, String param2) 
        ShowNameFragment fragment = new ShowNameFragment();
        Bundle args = new Bundle();
        args.putString(NAME, param1);
        args.putString(PROVINCE, param2);
        fragment.setArguments(args);
        return fragment;
    

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        if (getArguments() != null) 
            mName = getArguments().getString(NAME);
            mProvince = getArguments().getString(PROVINCE);
        
    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        return inflater.inflate(R.layout.fragment_show_name, container, false);
    

fragment_show_name.xml

<?xml version="1.0" encoding="utf-8"?>
<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"
    android:background="#00ff00"
    tools:context=".ShowNameFragment">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_blank_fragment"
        android:layout_gravity="center"
        android:textColor="#ffffff"
        android:background="#ff0000"/>

</FrameLayout>

2. 一定要用FrameLayout来装Fragment吗?用LinearLayout行不行?

试下:

//activity 布局修改
<?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"
    android:id="@+id/linearlayout"
    tools:context=".MainActivity">

</LinearLayout>

//fragment布局宽高改为200dp
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:background="#00ff00"
    tools:context=".ShowNameFragment">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_blank_fragment"
        android:layout_gravity="center"
        android:textColor="#ffffff"
        android:background="#ff0000"/>

</FrameLayout>

//加载id修改为linearlayout
  getSupportFragmentManager().beginTransaction()
                .replace(R.id.linearlayout, mFragment)
                .commit();

正常运行:

3. 一个布局里面只能加载一个Fragment吗?

当然不是。尝试在LinearLayout布局里面再加一个Fragment,这次不用replace(),这次用add()

		//activity修改
        ShowNameFragment mFragment = ShowNameFragment.newInstance("zj", "hubei");
        ShowNameFragment mFragment2 = ShowNameFragment.newInstance("zj", "guangdong");
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.linearlayout, mFragment)
                .commit();
        getSupportFragmentManager().beginTransaction()
                .add(R.id.linearlayout, mFragment2)
                .commit();
		
	//fragment修改
	@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        View view= inflater.inflate(R.layout.fragment_show_name, container, false);
        TextView tv=view.findViewById(R.id.tv_name);
        tv.setText(mProvince);
        return view;
    


效果如下图:

所以一个布局里面是可以加载多个Fragment的。

4. 为什么多数情况下采用FrameLayout加载Fragment?

因为多数情况下,一个布局里面只需要显示一个Fragment。这种情况下比起LinearLayout和RelativeLayout,使用FrameLayout更好。

以上是关于Fragment系列:使用FrameLayout动态加载的主要内容,如果未能解决你的问题,请参考以下文章

在android中使用fragment和frameLayout有啥区别?两者可以互换使用吗?

如何使用 FragmentManager 在 FrameLayout 中显示 Fragment A、B、C、...?

[Android] FrameLayout 的作用

FrameLayout系列:FrameLayout三连问

android自定义view怎么使用fragmentpageradapter

使用 androidx.fragment.app.FragmentContainerView 时出现 ClassNotFoundException