首页 > 解决方案 > 需要解释 - Android Studio 中的空白片段 Java 代码

问题描述

这是java为我的菜单项“专辑”创建的片段文件 -AlbumFragment.java

package postbox.twentyfour.mybag;

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link AlbumFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class AlbumFragment extends Fragment {

    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    public AlbumFragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment AlbumFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static AlbumFragment newInstance(String param1, String param2) {
        AlbumFragment fragment = new AlbumFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_album, container, false);
    }
}

请给出这个java代码的完整解释。

标签: javaandroidandroid-studioandroid-fragmentactivityfragment-lifecycle

解决方案


这是一个很长的,所以请坚持下去!

public class AlbumFragment extends Fragment

这里的重点是我们当然是从 Fragment API 扩展而来的。你的类(AlbumFragment)继承了很多代码!Fragment API 非常丰富,并且一如既往地值得保留指南文档以供参考。

private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

我们的参数参数键/标签被创建为常量。我们使用这些作为来引用 Bundle 中传递的数据,从中创建新的 Fragment 实例(对象)。在这种情况下,我假设您的主要活动。注意变量定义是大写的——这是用于常量的Java约定(一个在创建后不会改变的变量——即;最终的)。

private String mParam1;
private String mParam2;

用于在此片段(对象/类)的实例中存储数据的简单变量定义。

public AlbumFragment() {
    // Required empty public constructor
}

不幸的是,这是 Android Fragment API 的必要功能。你根本不会改变这一点。我相信随着您在 Android 之旅中的进展,您会了解更多相关信息!现在不要担心。

public static AlbumFragment newInstance(String param1, String param2) {
    AlbumFragment fragment = new AlbumFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

这是用于实例化片段的新实例的通用约定 - 在您的情况下是 AlbumFragment。(这不是解决问题的唯一方法,但肯定是一个好方法。)

您将从 MainActivity(或控制器)调用此方法,以创建此片段的新实例。使用此方法从您的控制器(在您的情况下为您的活动)传递数据。您可以根据需要更改这些参数以通过 Bundle 传递(序列化)数据。

不要因为这个方法在 AlbumFragment 本身中而感到困惑 - 请注意它是静态的。它只是一个辅助方法,在实例化一个新的 Fragment 对象时让生活更轻松。此方法中的逻辑可以在 MainActivity(或控制器)中轻松编写。

请参阅有关捆绑包的参考文档指南

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

此方法调用是 Fragment 生命周期的重要组成部分。

在这种情况下,我们正在访问任何保存的状态,并将保存的数据重新分配给我们的变量,因为我们可能会重新创建我们的片段。当您旋转手机屏幕时,或者当您的手机已经休眠一段时间并且您在一段时间后回到您的应用程序时,就会发生这种情况(这些只是众多示例中的两个)。这里有很多要考虑的地方,但实验会很好地为您服务!

片段生命周期本身就是一个完整的主题,但与活动生命周期共享许多类似的方法调用。理解 Activity 和 Fragment 生命周期很困难,但对于 Android 开发人员来说绝对是至关重要的。我不能推荐足够的坚持下去,无论那座山有多难爬(我自己也去过那里),从长远来看,它会对你产生很大的影响。

对于片段生命周期,您可以参考这些培训文档

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_album, container, false);
}

最后是另一个生命周期方法调用——在本例中为“onCreateView”。这是您的布局被夸大的地方,并且任何数据(存储在那些 mParam1、mParam2 变量中)都绑定到您的视图!这就是这些 XML 文件发挥作用的地方。

明智的说法 - 确保将您的 XML 中的 ID 分配给您希望在屏幕旋转/手机睡眠等时保存状态的任何布局视图。

android:id="@+id/some_id"

这将允许 android(在更简单的情况下)为您管理保存的状态,并且真的会节省很多挫败感!


推荐阅读