Android Studio中Fragment绑定报错:符号‘id’无法解析
解决Fragment跳转时资源ID无法解析的问题
问题背景
使用View Binding在Android Studio中实现两个Fragment的跳转,已在XML导航图配置好Fragment连接,但代码中出现资源ID无法解析的错误,涉及按钮ID和导航Action ID。提供的SettingsFragment代码如下:
package com.mqtt.workactiv.ui.settings; import static android.os.Build.VERSION_CODES.R; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.navigation.NavController; import androidx.navigation.Navigation; import com.mqtt.workactiv.databinding.FragmentSettingsBinding; public class SettingsFragment extends Fragment { private FragmentSettingsBinding binding; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { SettingsViewModel settingsViewModel = new ViewModelProvider(this).get(SettingsViewModel.class); binding = FragmentSettingsBinding.inflate(inflater, container, false); View root = binding.getRoot(); return root; } @Override public void onViewCreated (@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); NavController navController = Navigation.findNavController(view); Button gateConnButton; gateConnButton = view.findViewById(R.id.gatewayConnButton); gateConnButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { navController.navigate(R.id.action_navigation_setting_to_gateway4); } }); } }
错误原因分析
- 错误的R类导入:代码顶部导入了
android.os.Build.VERSION_CODES.R,这个R是Android版本常量类,而非项目的资源R类,导致无法识别布局和导航图中的ID。 - 冗余的findViewById:已启用View Binding,仍使用传统的
findViewById获取控件,既冗余又可能因R类错误引发问题。
解决方案步骤
1. 替换错误的R类导入
删除import static android.os.Build.VERSION_CODES.R;,添加项目的资源R类导入(若Android Studio未自动导入):
import com.mqtt.workactiv.R;
2. 用View Binding替代findViewById
直接通过初始化好的binding对象获取控件,无需再调用findViewById:
binding.gatewayConnButton.setOnClickListener(...)
3. 确保导航资源正确生成
若导航Action ID仍报错,执行Build -> Rebuild Project,让Android Studio重新生成资源索引。
修正后的完整代码
package com.mqtt.workactiv.ui.settings; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.navigation.NavController; import androidx.navigation.Navigation; import com.mqtt.workactiv.R; import com.mqtt.workactiv.databinding.FragmentSettingsBinding; public class SettingsFragment extends Fragment { private FragmentSettingsBinding binding; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { SettingsViewModel settingsViewModel = new ViewModelProvider(this).get(SettingsViewModel.class); binding = FragmentSettingsBinding.inflate(inflater, container, false); return binding.getRoot(); } @Override public void onViewCreated (@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); NavController navController = Navigation.findNavController(view); // 使用View Binding获取按钮并设置点击事件 binding.gatewayConnButton.setOnClickListener(v -> navController.navigate(R.id.action_navigation_setting_to_gateway4) ); } @Override public void onDestroyView() { super.onDestroyView(); binding = null; // 释放Binding引用,避免内存泄漏 } }
额外注意事项
- 确认View Binding已在app模块的
build.gradle中启用:android { buildFeatures { viewBinding true } } - 导航图中Action的ID需与代码中引用的完全一致,注意拼写和大小写。
内容的提问来源于stack exchange,提问作者asapsonter
相关产品推荐
相关产品推荐

