Android入门教程之Fragment的具体使用详解

yizhihongxing

Android入门教程之Fragment的具体使用详解

什么是Fragment?

Fragment是Android系统中的一个重要组建,它可以理解为Activity的模块化实现,可以通过将UI分割成多个模块来提高代码复用性和灵活性,同时能够更好地适应不同屏幕的尺寸和方向。

Fragment有自己的生命周期,并且可以被嵌套在其他Fragment或Activity中,可以在运行时添加和删除,并且可以使用Fragment管理器进行管理。

如何使用Fragment?

步骤一:创建Fragment类

首先我们需要创建一个Fragment类,通过继承Fragment类来实现,如下所示:

public class MyFragment extends Fragment {
    public MyFragment() {
        // Required empty public constructor
    }

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

同时,我们需要在res/layout文件夹中创建一个与Fragment对应的布局文件,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text_view"
        android:text="Hello Fragment!"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

步骤二:在Activity中添加Fragment

接下来我们需要在Activity中添加Fragment,通过FragmentManager来完成。如下所示:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        MyFragment fragment = new MyFragment();
        fragmentTransaction.add(R.id.fragment_container, fragment);
        fragmentTransaction.commit();
    }
}

在这里,我们使用了FragmentManager来获取Fragment事务的实例,然后使用beginTransaction()方法开始一个新的事务。

接着我们创建了一个MyFragment对象,并使用add()方法将其添加到Activity中对应的容器中,最后使用commit()方法提交这个事务。

同时,我们还需要在Activity的布局文件中添加一个用于显示Fragment的容器,如下所示:

<FrameLayout
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

这样,我们就完成了将Fragment添加至Activity的过程。

步骤三:Fragment的交互

在Fragment中可以处理用户的交互事件,并通过getActivity()方法来获取到其所在的Activity的实例,从而实现Fragment和Activity之间的交互。如下所示:

public class MyFragment extends Fragment {

    private TextView mTextView;

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

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

    private void initView(View view) {
        mTextView = view.findViewById(R.id.text_view);
        mTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Activity activity = getActivity();
                Toast.makeText(activity, "Hello Activity!", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

在这里,我们通过在TextView上设置OnClickListener来处理点击事件,当用户点击TextView时,我们通过getActivity()方法获取到Activity的实例,然后使用Toast来显示提示信息。

另外,我们还需要在Activity的布局文件中添加一个用于显示交互结果的TextView,如下所示:

<TextView
    android:id="@+id/result_text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

然后在MainActivity中获取到这个TextView并设置其文字,如下所示:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        MyFragment fragment = new MyFragment();
        fragmentTransaction.add(R.id.fragment_container, fragment);
        fragmentTransaction.commit();

        TextView resultTextView = findViewById(R.id.result_text_view);
        resultTextView.setText("Hello MainActivity!");
    }
}

这样,当我们点击Fragment中的TextView时,就会显示提示信息"Hello Activity!",同时在Activity布局文件中的TextView中也会显示"Hello MainActivity!"。

Fragment的生命周期

Fragment的生命周期由如下几个方法组成:

  • onAttach(): 当Fragment被依附到Activity时调用
  • onCreate(): 当Fragment被创建时调用
  • onCreateView(): 当Fragment的视图被创建时调用
  • onActivityCreated(): 当Fragment所依附的Activity完成 onCreate() 方法时调用
  • onStart(): 当Fragment可见时调用
  • onResume(): 当Fragment获得用户焦点时调用
  • onPause(): 当Fragment失去用户焦点时调用
  • onStop(): 当Fragment不可见时调用
  • onDestroyView(): 当Fragment视图被销毁时调用
  • onDestroy(): 当Fragment被销毁时调用
  • onDetach(): 当Fragment和Activity分离时调用

示例说明

示例一:Fragment的切换

我们可以使用FragmentTransaction来管理Fragment的切换,通过添加、移除、替换、隐藏、显示等方法实现,如下所示:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private ImageView mMenuImageView;
    private MenuFragment mMenuFragment;
    private ContentFragment mContentFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();

        switchFragment(FragmentType.MENU);
    }

    private void initView() {
        mMenuImageView = findViewById(R.id.menu_image_view);
        mMenuImageView.setOnClickListener(this);
    }

    private void switchFragment(FragmentType type) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        hideAllFragment(fragmentTransaction);

        switch (type) {
            case MENU:
                if (mMenuFragment == null) {
                    mMenuFragment = new MenuFragment();
                    fragmentTransaction.add(R.id.fragment_container, mMenuFragment);
                } else {
                    fragmentTransaction.show(mMenuFragment);
                }
                break;
            case CONTENT:
                if (mContentFragment == null) {
                    mContentFragment = new ContentFragment();
                    fragmentTransaction.add(R.id.fragment_container, mContentFragment);
                } else {
                    fragmentTransaction.show(mContentFragment);
                }
                break;
        }

        fragmentTransaction.commit();
    }

    private void hideAllFragment(FragmentTransaction transaction) {
        if (mMenuFragment != null) {
            transaction.hide(mMenuFragment);
        }
        if (mContentFragment != null) {
            transaction.hide(mContentFragment);
        }
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.menu_image_view:
                switchFragment(FragmentType.CONTENT);
                break;
        }
    }

    private enum FragmentType {
        MENU,
        CONTENT
    }
}

在这里,我们通过switchFragment()方法来切换Fragment,使用枚举变量FragmentType来表示不同的Fragment,然后通过hideAllFragment()方法来隐藏所有已添加的Fragment,最后使用show()或add()方法添加或显示对应的Fragment。

同时,我们还需要在Activity的布局文件中添加一个ImageView,用于跳转到对应Fragment,如下所示:

<ImageView
    android:id="@+id/menu_image_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_menu" />

示例二:Fragment的通信

我们可以使用接口来实现Fragment和Activity之间的通信,具体实现步骤如下:

首先,在Fragment中定义一个接口,如下所示:

public interface OnItemClickListener {
    void onItemClick(String content);
}

然后在Fragment中通过接口回调来实现与Activity的通信,如下所示:

private OnItemClickListener mListener;

@Override
public void onAttach(@NonNull Context context) {
    super.onAttach(context);
    if (context instanceof OnItemClickListener) {
        mListener = (OnItemClickListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnItemClickListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

private void initView(View view) {
    mView = view.findViewById(R.id.list_view);
    mAdapter = new MyAdapter(mList, mListener);
    mView.setAdapter(mAdapter);
}

在这里,我们首先在Fragment的生命周期中调用onAttach()方法,将接口类型的mListener赋值为Activity传入的回调实例。然后在调用onDetach()方法时将mListener置为null,避免对Activity的引用。

接着,我们在对应的View上设置对应的OnClickListener,并在方法中调用接口回调导致Activity的方法执行,实现Fragment和Activity之间的通信,如下所示:

public class MainActivity extends AppCompatActivity implements OnItemClickListener {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        switchFragment();
    }

    @Override
    public void onItemClick(String content) {
        ContentFragment fragment = ContentFragment.newInstance(content);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment_container, fragment)
                .addToBackStack(null)
                .commit();
    }
}

在Activity中,我们需要实现该接口,然后将实例传入给Fragment,在具体实现的方法中处理来自Fragment的回调。

同时,在Fragment中我们也需要通过newInstance()方法来创建该Fragment的实例,并在其中传入调用该方法所需的参数,以实现传参传递,如下所示:

public static ContentFragment newInstance(String content) {
    ContentFragment fragment = new ContentFragment();
    Bundle args = new Bundle();
    args.putString(ARG_CONTENT, content);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mContent = getArguments().getString(ARG_CONTENT);
    }
}

private void initView(View view) {
    mTextView = view.findViewById(R.id.content_text_view);
    mTextView.setText(mContent);
}

在这里,我们首先通过newInstance()方法来创建Fragment的实例,并将需要传递的参数设置到Bundle中。然后在Fragment的生命周期方法中通过getArguments()方法获取到传递的参数,最后实现具体的UI显示。

同时,我们还需要在Activity的布局文件中添加一个用于显示ContentFragment的TextView,如下所示:

<FrameLayout
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<TextView
    android:id="@+id/content_text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

这样,我们就完成了Fragment和Activity之间的通信过程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android入门教程之Fragment的具体使用详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 如何检测网络中的重复IP地址 防止ip地址冲突

    如何检测网络中的重复IP地址 防止IP地址冲突 在网络中,重复的IP地址可能会导致IP地址冲突,从而影响网络通信和设备连接。为了避免这种情况的发生,我们可以采取以下步骤来检测网络中的重复IP地址并防止IP地址冲突。 步骤一:扫描网络中的IP地址 首先,我们需要扫描网络中的所有IP地址,以便确定是否存在重复的IP地址。可以使用网络扫描工具来完成这个任务,例如N…

    other 2023年7月31日
    00
  • rmarkdown下latex公式对齐

    rmarkdown下latex公式对齐 在rmarkdown中,我们可以使用LaTeX语法来插入公式。有时候,我们需要对多个公式进行对齐,以便更好地展现。本攻略将详细介绍如何在rmarkdown中对齐LaTeX公式,包括两个示例说明。 使用align环境 在TeX中,我们可以使用align环境来对齐公式。在rmarkdown中,我们可以使用$$符号来插入La…

    other 2023年5月7日
    00
  • 霍格沃茨之遗点击接受条件闪退怎么办 点击接受条款闪退解决方法

    霍格沃茨之遗点击接受条件闪退怎么办 问题描述 当在霍格沃茨之遗游戏中点击接受条款时,应用程序突然闪退。 原因分析 这个错误通常是由于应用程序的某些文件被损坏或者缺失引起的。 解决方案 1. 删除缓存文件 首先,我们需要尝试删除应用程序的缓存文件,这可能会解决问题。 打开文件管理器,找到存储游戏的文件夹。 在文件夹中找到“Cache”文件夹。 右键单击该文件夹…

    other 2023年6月27日
    00
  • 小程序自定义组件全局样式不生效的解决方法

    当我们在小程序中使用自定义组件时,有时我们希望在组件中设置全局样式,但是发现这些样式并没有生效。这种情况通常是因为小程序默认会对组件的样式进行隔离,所以全局样式无法生效。解决方法如下: 1. 使用 wxss 文件实现全局样式 在小程序的根目录新建一个 app.wxss 文件,并在此文件中定义全局样式。然后在自定义组件中通过 @import 引入 app.wx…

    other 2023年6月27日
    00
  • 简单实用的磁带转mp3方法图解

    以下是详细讲解“简单实用的磁带转MP3方法图解的完整攻略,过程中至少包含两条示例说明”的标准Markdown格式文本: 简单实用的磁带转MP3方法图解攻略 如果您有一些老式的磁带录音,想要将它们转换成数字格式,以便在现代设备上播放和存储,那么本攻略将为您提供一种简单实用的磁带转MP3的方法。本攻略将包括以下步骤:准备工作、连接设备、录制音频、转换格式、保存文…

    other 2023年5月10日
    00
  • Win10 Build 14393.1378累积更新补丁KB4022723下载地址(附修复解决问题+已知问题)

    Win10 Build 14393.1378累积更新补丁KB4022723下载地址(附修复解决问题+已知问题)攻略 下载地址 你可以从以下位置下载Win10 Build 14393.1378累积更新补丁KB4022723: 官方下载链接 备用下载链接 修复解决问题 该累积更新补丁KB4022723解决了以下问题: 问题1:某些应用程序在运行时崩溃。 解决方案…

    other 2023年8月5日
    00
  • vmwarenat模式下设置网络

    vmwarenat模式下设置网络 在使用虚拟机时,有时候我们需要设置不同的网络模式。本文将介绍如何在 vmwarenat 模式下设置网络。vmwarenat 模式是一种网络模式,在此模式下,虚拟机可以访问本地网络和 Internet。 什么是 vmwarenat 模式 vmwarenat 模式是一种网络模式,是一种将虚拟机虚拟在 NAT(网络地址转换)子网内…

    其他 2023年3月28日
    00
  • 一款js和css代码压缩工具[附JAVA环境配置方法]

    一款JS和CSS代码压缩工具攻略 本攻略将详细介绍一款用于压缩JS和CSS代码的工具,并提供JAVA环境配置方法。以下是完整的攻略过程: 1. 工具介绍 该工具是一款用于压缩JS和CSS代码的工具,可以帮助开发者减小文件体积,提高网页加载速度。它使用JAVA语言编写,支持跨平台运行。 2. JAVA环境配置 为了运行该工具,您需要先配置JAVA环境。请按照以…

    other 2023年8月8日
    00
合作推广
合作推广
分享本页
返回顶部