• 使用Fragment 实现动态UI 和 动态添加Fragment


    首先写好每个Fragment:

    1.在第一个Fragment写一个按钮,使其加载下一个Fragment

    布局:

    <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"
        tools:context=".MainActivity"
        android:orientation="horizontal" >
    
    
            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="加载"/>
    
    </LinearLayout>

    java代码:

    public class LeftFragment extends Fragment{
    
    
        OnClickButton mCallback;
        //定义一个接口
        public interface OnClickButton{
            //并实现一个方法,用来传值并在(onAttach()中绑定activity)
            public void onClickB();
        }
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            //绑定布局文件并获取到里面的控件,特别 注意里面的  view
            View view = inflater.inflate(R.layout.fragment_left,null);
            Button button = (Button) view.findViewById(R.id.button1);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mCallback.onClickB();
                }
            });
            return view;
        }
    
        /**
         * 绑定到activity
         * @param activity
         */
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            try {
                mCallback = (OnClickButton) activity;
            } catch (ClassCastException e) {
                throw new ClassCastException(activity.toString()
                        + " must implement OnHeadlineSelectedListener");
            }
        }
    }

    加载显示出来的布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="新闻内容" />
    
        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />
    
    </LinearLayout>

    java文件:

    public class RightFragment extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_right, null);
            Button button = (Button) view.findViewById(R.id.button2);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //getActivity()   获取父类的activity
                    Toast.makeText(getActivity(), "我是fragment", Toast.LENGTH_SHORT).show();
                }
            });
            return view;
        }
    }

    主类:

    布局

    给Fragment创建一个容器activity_main.xml  

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

    注意:一定要写明id。

    然后就在activity中实现Fragment add进去就行了!

    //实现LeftFragment中定义的接口,主要用来传值或者按钮点击事件
    public class MainActivity extends Activity implements LeftFragment.OnClickButton {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //初始化第一个Fragment
            if (findViewById(R.id.fragment_container) != null){
                if (savedInstanceState != null) {
                    return;
                }
            LeftFragment leftFragment = new LeftFragment();
            leftFragment.setArguments(getIntent().getExtras());
            getFragmentManager().beginTransaction().add(R.id.fragment_container,leftFragment).commit();
            }
        }
    
        /**
         * 实现接口中的方法和点击按钮后加载的fragment
         */
        @Override
        public void onClickB() {
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction transaction = fragmentManager.beginTransaction();
            RightFragment rightFragment = new RightFragment();
            transaction.replace(R.id.fragment_container, rightFragment);
            transaction.addToBackStack(null);
            transaction.commit();
        }
    }

    这样就实现了一个很小的demo!

    动态添加Fragment


    首先新建两个fragment的布局文件

    fragment1

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#00ff00" >
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="This is fragment 1"
            android:textColor="#000000"
            android:textSize="25sp" />
    
    </LinearLayout>

    fragment2

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#0000ff" >
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="This is fragment 2"
            android:textColor="#000000"
            android:textSize="25sp" />
    
    </LinearLayout>

    新建两个Fragment类继承Fragment

    Fragment1

    public class Fragmet1 extends Fragment {
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment1,container,false);
        }
    }

    Fragment2

    public class Fragmet2 extends Fragment {
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment2,container,false);
        }
    }

    然后定义一个显示fragment的mainactivity.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:baselineAligned="false" >
    
        <Button
            android:id="@+id/btn_show_fragment1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="显示Fragment1"/>
    
        <Button
            android:id="@+id/btn_show_fragment2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="显示Fragment2"/>
    
        <FrameLayout
            android:id="@+id/fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
    </LinearLayout>

    其中FrameLayout是用来显示Fragment的,在MainActivity中实现

    public class MainActivity extends FragmentActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_activity);
    
            Button button1 = (Button) findViewById(R.id.btn_show_fragment1);
            button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //动态添加Fragment
                    FragmentManager manager = getSupportFragmentManager();
                    FragmentTransaction ft = manager.beginTransaction();
                    Fragmet1 fragmet1 = new Fragmet1();
                    ft.add(R.id.fragment_container,fragmet1);
                    ft.commit();
                }
            });
            Button button2 = (Button) findViewById(R.id.btn_show_fragment2);
            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    FragmentManager manager = getSupportFragmentManager();
                    FragmentTransaction ft = manager.beginTransaction();
                    Fragmet2 fragmet2 = new Fragmet2();
                    ft.add(R.id.fragment_container,fragmet2);
                    ft.commit();
                }
            });
        }
    }

    ok 基本就完成了。

    注意:

    动态添加Fragment主要分为4步:

      • 1.获取到FragmentManager,在V4包中通过getSupportFragmentManager,在系统中原生的Fragment是通过getFragmentManager获得的。
      • 2.开启一个事务,通过调用beginTransaction方法开启。
      • 3.向容器内加入Fragment,一般使用add或者replace方法实现,需要传入容器的id和Fragment的实例。
      • 4.提交事务,调用commit方法提交。 
  • 相关阅读:
    自己写的基类:Forms身份验证类、客户端事件类,序列化类下载
    毕业设计上线啦!跳蚤部落与基于Comet的WebIM系统开发
    域名解析碎片整理 《不同的子域名解析到同一服务器下不同的网站》
    Mac 命令行大全
    position 事件 zindex
    vue 微信公众号网页开发 跳转小程序 踩坑
    React 笔记
    我对架构师的理解(如何成为一个合格的架构师)
    听过我爸是李刚,你听说过我妈是上海人不?
    Lucene.NET打造站内搜索引擎
  • 原文地址:https://www.cnblogs.com/android-host/p/5284455.html
Copyright © 2020-2023  润新知