Android入门笔记(一)

一、UI fragment

       1.1 为什么要使用 fragment 和对托管的相关理解

       为了对组件进行更加灵活的控制,同时适应平板的大屏幕布局方式,所以引入 UI fragment 来对 UI 进行管理。fragment 类的作用与普通项目中的 avtivity 作用相同,都是负责创建并管理用户界面,以及与模型界面进行交互。activity 对 fragment 进行托管:即 activity 在其视图层里提供一处位置,用来放置 fragment 视图,但 fragment 本身是没有再屏幕上显示视图的能力。因此,只有将它的视图放置在 activity 的视图层级结构中,fragment 视图才能显示在屏幕上。

       1.2 怎样通过 fragment 来创建一个项目

(1)在 java/项目名称 目录下创建对 fragment 进行托管且继承 AppCompatActivity 类的 activity 类,命名为如:ArticleActivity.java。

(2)在 res/layout 下创建托管容器布局文件,如:activity_article.xml。

(3)将托管容器视图文件的视图设置为 FrameLayout ,并设置其 id ,如:fragment_container。

(4)在 java/项目名称 目录下创建相关且继承 Fragment 类的 fragment 类,如:ArticleFragment.java。

(5)在 res/layout 下创建 fragment UI 布局文件(可先将其视图设为 LinearLayout),如:fragment_article.xml。

(6)之后进行相关模型类的创建,并编写其相关的构造方法和set、get方法。

(7)之后进入 fragment 类中,在其 onCreate 方法中完成缓存的读取和相关模型类的实例化,在其 onCreateView 中,通过 inflater.inflate 方法来获取 fragment 视图,代码如下:

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_article, container, false);
        mSubmit = (Button) view.findViewById(R.id.article_submit);
        return view;
    }

    在 inflate 方法中,第一个参数为 该 fragment 视图布局的资源ID,第二个参数是该视图的父视图,我们通常需要父视图来正确配置组件,第三个参数告诉布局生成器是否将生成的视图添加给父视图,false 即为通过代码的方式添加试图。fragment 中的 onCreateView 方法相当于 activity 中的 onCreate 方法,在这个方法中应完成相关组件的获取和设置监听工作,唯一的区别是 fragment 中应调用 view.findViewById 的方法来获取组件,而在 activity 中只需调用 findViewById 即可,即 activity 中的方法会在后台自动调用 view.findViewById ,而在 fragment 中只能通过手动调用。 

(8)在托管该 fragment 的 activity 中的 onCreate 方法中获取 FragmentManager,为解决兼容问题使用 getsupportFragmentManager 来进行获取。

FragmentManager fragmentManager = getSupportFragmentManager();

(9)再 fragment 的获取,如果 fragment 队列中有我们所需要的 fragment 即返回,否则进行初始化创建,注意需要获取特定的 fragment 只需提供其容器视图 ID 即可。beginTransaction 方法创建并返回 FragmentTransaction 实例,之后调用 add 方法将新创建的 fragment 事务加入队列中,add 方法的第一个参数是容器视图资源ID第二个参数为新创建的 fragment。

Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);

if (fragment == null){
     fragment = new LearnFragment();
     fragmentManager.beginTransaction().add(R.id.fragment_container, fragment).commit();
}

猜你喜欢

转载自blog.csdn.net/qq_40697071/article/details/82817219