Android Studio同抽屉导航下Fragment间EditText到TextView传值方法
抽屉导航下两个Fragment间传递用户名的实现步骤
一、先调整布局文件
首先给两个Fragment的布局添加对应控件:
- 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>
- 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
相关产品推荐
相关产品推荐

