Android之静态和动态加载Fragment

一、fragment的静态加载和动态加载的理解:

         我觉得可以把fragment当做为一个自定义的布局,然后去使用这个定义好的布局,对于静态和动态的理解是,静态是讲在主布局文件中放入fragment布局,然后使用,而动态是不需要在主布局文件中去声明fragment的,而是直接在java代码中去添加。

二、通过一个例子来理解:

说明下下面的图:第一个为主界面,通过两个按钮来分别实现静态和动态效果

                  

静态实现:

定义一个fragment_layout布局文件作为静态添加的对象:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:background="#aabbcc"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
   <TextView
       android:textSize="30sp"
       android:text="这是静态加载的fragment"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content" />
</LinearLayout>

定义一个MyFragment类,继承Fragment:

public class MyFragment extends Fragment{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        //定义一个view对象,并返回
        //第一个参数为上面定义的布局文件,第二参数为传入的参数,第三个参数一般设为false
        View view=inflater.inflate(R.layout.fragment_layout,container,false);
        return view;
    }
}

创建一个主布局文件activity_main2中放入fragment:(注意这里添加的Fragment要加入name属性)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   
android:orientation="vertical" android:layout_width="match_parent"
   
android:layout_height="match_parent">

    <fragment
       
android:id="@+id/myfragment"
       
android:layout_width="match_parent"
       
android:layout_height="match_parent"
       
android:name="base.learnfragment.MyFragment"/>

</LinearLayout>

然后再创建一个ActivityMain2加载第二个活动的主布局:

public class ActivityMain2 extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
    }
}

至此,一个静态的fragment就实现 了。

下面我们来补充第一个活动的主布局activity_main:(注意这里要加入一个id:container(可以自己定义))

<LinearLayout 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:orientation="vertical"
   
android:id="@+id/container"
   
tools:context="base.learnfragment.MainActivity">


    <Button
       
android:text="静态加载fragment"
       
android:id="@+id/btn_static"
       
android:layout_width="wrap_content"
       
android:layout_height="wrap_content" />

    <Button
       
android:text="动态加载fragment"
       
android:id="@+id/btn_dongtai"
       
android:layout_width="wrap_content"
       
android:layout_height="wrap_content" />

</LinearLayout>

定义第二个类MyFragment2,以及布局文件fragment_layout2:

public class MyFragment2 extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_layout2,container,false);
        return view;
    }
}
 
<LinearLayout
   
android:background="#ff0000"
   
xmlns:android="http://schemas.android.com/apk/res/android"
   
android:orientation="vertical"
   
android:layout_width="match_parent"
   
android:layout_height="match_parent">

    <TextView
       
android:textSize="30sp"
       
android:text="这是动态加载的fragment"
       
android:layout_width="match_parent"
       
android:layout_height="match_parent" />

</LinearLayout>

补充MainActivity:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn_static).setOnClickListener(this);
        findViewById(R.id.btn_dongtai).setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_static:
                //跳转到第二个活动,使第二活动完成静态加载fragment
               
startActivity(new Intent(MainActivity.this,ActivityMain2.class));

                break;
            case R.id.btn_dongtai:
                //声明我们自定义的fragment
               
MyFragment2 fragment2=new MyFragment2();

                //动态添加到布局中,注意replace中的第一个参数为activity_main中的id
               
getSupportFragmentManager().beginTransaction().replace(R.id.container,fragment2).commit();

                break;
        }
    }
}

这样动态添加也完成了。

总结一下:

1.注意每一个fragment的布局都要有一个与之对应的继承于Fragment的类。

2.关于继承.app.Fragment和.support.v4.app.Fragment的问题:

如果要使用前者,那么MainActivity继承Activity即可,然后动态添加时,是getFragmetManager();

如果使用后者,那么MainActivity要继承FragActivty,然后动态添加时,是getSupportFragmentManager();

原文地址:https://www.cnblogs.com/xy95/p/5972079.html