zoukankan      html  css  js  c++  java
  • 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();

  • 相关阅读:
    如何在Grid中做出快捷菜单效果?
    ExtJs FormPanel布局
    wpf 中获取ComboBox中选定的文本值
    delphi中的dbgrid使用
    Delphi修改Access密码,压缩与修复,建立Access数据库文件
    关于OS X系统root账号的激活及密码更改
    Delphi过程函数传递参数的几种方式
    Eclipse里的快捷键
    Delphi封装类到DLL
    Delphi Project 之工程选项(Project Options)
  • 原文地址:https://www.cnblogs.com/xy95/p/5972079.html
Copyright © 2011-2022 走看看