• [android] fragment的动态创建


    在一个商业软件中,会有很多的界面,如果没一个界面对应一个activity,那么activity会非常的多,清单文件也会非常的乱,谷歌在android3.0以后引入了新的概念叫fragment

    fragment无需在清单文件中配置,轻量级的activity,在所属的activity布局文件中进行配置

    在布局文件中使用fragment控件

    添加<fragment>节点,设置名称是fragment指向的类全路径

    其他属性和别的控件一样

    新建一个类Fragment1继承系统的Fragment类,此时会报错误,是因为,我们兼容的android系统最低版本是8fragment11版本才引入的,可以先把兼容版本改成11

    重写onCreateView()方法,当fragment被创建的时候回调的方法,返回当前的View对象,传递进来一个LayoutInflate对象,

    调用LayoutInflate对象的inflate()方法,获得View对象,参数:资源,ViewGroup对象

    fragment最初设计的时候,是为了适应平板的大屏幕,例如,左侧一个listview,右边一个fragment,点击ListView的不同的条目,右边fragment的内容随之变化,用户体验更好

    动态创建

    实现,当用户竖着拿手机显示一个界面,当横着拿时显示另外一个界面

    判断当前手机的朝向,通过屏幕的宽度和高度的对比来实现

    调用getWindowManager().getDefaultDisplay().getWidth()获取宽度

    调用getWindowManager().getDefaultDisplay().getHeight()获取高度

    如果高度大于宽度,是竖屏

    如果宽度大于高度,是横屏

    新建Fragment1Fragment2类,继承系统的Fragment

    获取Fragment对象,通过new出来

    获取FragmentManager对象,通过getFragmentManager()方法

    调用FragmentManager对象的beginTransaction()方法,开启事务,获得FragmentTransaction对象

    调用FragmentTransaction对象的replace()方法,用Fragment替换当前界面,参数:containerViewIdFragment对象

    containerViewId是容器的id,可以使用android.R.id.content代表当前界面的id

    调用FragmentTransaction对象的commit()方法,提交事务

    模拟器ctrl+f11切换横竖屏

    MainActivity.java

    package com.tsh.myfragment;
    
    import android.app.Activity;
    import android.app.FragmentManager;
    import android.app.FragmentTransaction;
    import android.os.Bundle;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Fragment1 f1 = new Fragment1();
            Fragment2 f2 = new Fragment2();
            // 判断横竖屏
            int width = getWindowManager().getDefaultDisplay().getWidth();
            int height = getWindowManager().getDefaultDisplay().getHeight();
            FragmentManager fm = getFragmentManager();
            FragmentTransaction fr = fm.beginTransaction();
            if (width < height) {// 竖屏
                fr.replace(android.R.id.content, f1);
            } else {// 横屏
                fr.replace(android.R.id.content, f2);
            }
            fr.commit();
        }
    }

    Fragment1.java

    package com.tsh.myfragment;
    
    import android.app.Fragment;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class Fragment2 extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment2, null);
        }
    }
  • 相关阅读:
    微分方程概述
    Vite 使用TSX/JSX
    java去掉html标签,只留文本内容
    设置gradle默认缓存文件路径(笔记)
    mysql 求年龄
    sql 工作记录1
    windows脚本创建桌面快捷图标方式
    vue命名规范
    span做成按钮时,文字不被选中样式
    Vue3 + Vite + TS项目引入iconfont图标(Svg方式)
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5406082.html
Copyright © 2020-2023  润新知