【问题标题】:Explanation needed for - Blank Fragment Java code in Android Studio [closed]需要解释-Android Studio中的空白片段Java代码[关闭]
【发布时间】:2020-09-27 05:35:02
【问题描述】:
  • 我正在使用 Android Studio 中的底部导航栏

  • 创建菜单和其他MainActivity.java 代码后,创建 我的菜单项的片段。

  • 所以我在 Android Studio 中选择了BlankFragment 模板。

  • 它为我的菜单项创建了.java.xml 文件。

  • 创建的 Fragment.java 文件包含一些内置代码,而我没有 明白code是什么意思

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

【问题讨论】:

    标签: java android android-studio android-fragmentactivity fragment-lifecycle


    【解决方案1】:

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

    public class AlbumFragment extends Fragment
    

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

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

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

    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(或控制器)中。

    请参阅捆绑包上的 reference docsguides

    @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 开发人员来说绝对是至关重要的。我不能推荐足够的坚持下去,无论那座山有多难攀登(我自己也去过那里),从长远来看,它会对你产生很大的影响。

    片段生命周期可以参考这些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 分配给您希望在屏幕旋转/手机休眠等时保存状态的任何布局视图。

    android:id="@+id/some_id"
    

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

    【讨论】:

      【解决方案2】:

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


      希望this 也会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-15
        • 2013-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-15
        相关资源
        最近更新 更多