You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio同抽屉导航下Fragment间EditText到TextView传值方法

抽屉导航下两个Fragment间传递用户名的实现步骤

一、先调整布局文件

首先给两个Fragment的布局添加对应控件:

  1. HomeFragment的布局(fragment_home.xml):添加输入用户名的EditText和提交按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/et_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入用户名"/>

    <Button
        android:id="@+id/btn_submit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="提交用户名"
        android:layout_marginTop="16dp"/>

    <TextView
        android:id="@+id/text_home"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"/>
</LinearLayout>
  1. CatalogoFragment的布局(fragment_catalogo.xml):添加用来显示用户名的TextView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/tv_display_username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="用户名:"
        android:textSize="18sp"/>

    <TextView
        android:id="@+id/text_catalogo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"/>
</LinearLayout>

二、修改Fragment代码,正确使用SharedViewModel

核心是让两个Fragment共享同一个SharedViewModel实例,获取ViewModel时传入getActivity()(抽屉导航的Fragment同属一个Activity),而非this。

1. 修改HomeFragment代码

该Fragment负责获取EditText输入并传递数据到ViewModel:

package com.example.devmobile.ui.home;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import com.example.devmobile.SharedViewModel;
import com.example.devmobile.databinding.FragmentHomeBinding;

public class HomeFragment extends Fragment {

    private FragmentHomeBinding binding;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        // 获取共享ViewModel,传入getActivity()保证两个Fragment用同一个实例
        SharedViewModel sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);

        binding = FragmentHomeBinding.inflate(inflater, container, false);
        View root = binding.getRoot();

        // 获取EditText和Button
        EditText etUsername = binding.etUsername;
        Button btnSubmit = binding.btnSubmit;

        // 按钮点击事件:获取输入的用户名并传给ViewModel
        btnSubmit.setOnClickListener(v -> {
            String username = etUsername.getText().toString().trim();
            if (!username.isEmpty()) {
                sharedViewModel.selectItem(username);
            }
        });

        return root;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }
}

2. 修改CatalogoFragment代码

该Fragment负责监听ViewModel数据变化并更新UI:

package com.example.devmobile.ui.catalogo;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import com.example.devmobile.SharedViewModel;
import com.example.devmobile.databinding.FragmentCatalogoBinding;

public class CatalogoFragment extends Fragment {

    private FragmentCatalogoBinding binding;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        // 获取同一个共享ViewModel
        SharedViewModel sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);

        binding = FragmentCatalogoBinding.inflate(inflater, container, false);
        View root = binding.getRoot();

        // 获取显示用户名的TextView
        TextView tvDisplayUsername = binding.tvDisplayUsername;

        // 监听ViewModel数据变化,自动更新TextView
        sharedViewModel.getSelectedItem().observe(getViewLifecycleOwner(), username -> {
            tvDisplayUsername.setText("用户名:" + username);
        });

        return root;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }
}

三、关键知识点说明

  • SharedViewModel:作为两个Fragment的数据中转站,其生命周期与所属Activity绑定,切换Fragment时数据不会丢失。
  • ViewModelProvider(requireActivity()):以Activity作为ViewModel的所有者,确保两个Fragment拿到同一个实例,实现数据共享。
  • LiveData观察:observe方法会监听数据变化,当HomeFragment更新数据时,CatalogoFragment会自动收到通知并刷新UI。

内容的提问来源于stack exchange,提问作者Snufupugos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 16:13:25