在一个商业软件中,会有很多的界面,如果没一个界面对应一个 activity ,那么 activity 会非常的多,清单文件也会非常的乱,谷歌在 android3.0 以后引入了新的概念叫 fragment
fragment 无需在清单文件中配置,轻量级的 activity ,在所属的 activity 布局文件中进行配置
在布局文件中使用 fragment 控件
添加 <fragment> 节点,设置名称是 fragment 指向的类全路径
其他属性和别的控件一样
新建一个类 Fragment1 继承系统的 Fragment 类,此时会报错误,是因为,我们兼容的 android 系统最低版本是 8 , fragment 是 11 版本才引入的,可以先把兼容版本改成 11
重写 onCreateView() 方法,当 fragment 被创建的时候回调的方法,返回当前的 View 对象,传递进来一个 LayoutInflate 对象,
调用 LayoutInflate 对象的 inflate() 方法,获得 View 对象,参数:资源, ViewGroup 对象
fragment 最初设计的时候,是为了适应平板的大屏幕,例如,左侧一个 listview ,右边一个 fragment ,点击 ListView 的不同的条目,右边 fragment 的内容随之变化,用户体验更好
动态创建
实现,当用户竖着拿手机显示一个界面,当横着拿时显示另外一个界面
判断当前手机的朝向,通过屏幕的宽度和高度的对比来实现
调用 getWindowManager().getDefaultDisplay().getWidth() 获取宽度
调用 getWindowManager().getDefaultDisplay().getHeight() 获取高度
如果高度大于宽度,是竖屏
如果宽度大于高度,是横屏
新建 Fragment1 和 Fragment2 类,继承系统的 Fragment 类
获取 Fragment 对象,通过 new 出来
获取 FragmentManager 对象,通过 getFragmentManager() 方法
调用 FragmentManager 对象的 beginTransaction() 方法,开启事务,获得 FragmentTransaction 对象
调用 FragmentTransaction 对象的 replace() 方法,用 Fragment 替换当前界面,参数: containerViewId , Fragment 对象
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); } }