需要解释 - Android Studio 中的空白片段 Java 代码

Explanation needed for - Blank Fragment Java code in Android Studio

这是为我的菜单项 'Album' 创建的片段 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 代码的完整解释。

顶部是您程序的 package,下面是您在代码中使用的 import classes
您的 class“AlbumFragment”扩展了 Fragment,因此它是 Fragment 的子class,您可以使用其中的所有方法(片段的完整解释 here) .
public final 字符串是永不改变的字符串,为此您将它们声明为最终字符串。
接下来在 AlbumFragment 中创建一个新的片段实例,传入函数 param1 和 param2 。
您使用 bundle 是因为重新创建片段时参数仍然可用。
onCreate si 调用来进行片段的初始创建,onCreatView 回调用于定义布局。


希望 this 也会有所帮助。

这篇文章很长,所以请坚持下去!

public class AlbumFragment extends Fragment

这里的要点是,我们当然是从Fragment API 延伸出来的。您的 class (AlbumFragment) 继承了很多代码!片段 API 内容丰富,一如既往地值得保留 guides and docs 以供参考。

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

我们的参数参数 keys/labels 被创建为常量。我们将它们用作 key 来引用从创建新 Fragment 实例(对象)的 Bundle 中传递的数据。在这种情况下,我假设您的 Main Activity。请注意,变量定义以大写字母表示 - 这是用于常量的 Java 约定(变量在创建后不会更改 - 即;final)。

private String mParam1;
private String mParam2;

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

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

不幸的是,这是 Android 片段 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(或控制器)调用此方法,以创建此片段的新实例。使用此方法从您的控制器传递数据(您的 Activity 在您的情况下)。您可以根据需要更改这些参数以通过 Bundle 传递(序列化)数据。

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

请参阅捆绑包上的 reference docs and guides

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

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

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

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

片段生命周期可以参考这些training docs.

    @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 分配给您希望在屏幕旋转/phone 睡眠等情况下保存的任何布局视图

android:id="@+id/some_id"

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