Android Studio中Fragment内Button的OnClickListener点击无响应问题求助
嘿,我一眼就发现问题出在哪啦!你的按钮点击没反应,核心原因是你加载了两个完全独立的View实例,而你设置点击事件的那个View根本没被显示在界面上。
问题分析
看你的代码细节:
- 你已经通过View Binding正确加载了布局,拿到了要显示的根视图
root:binding = FragmentWeightBinding.inflate(inflater, container, false); View root = binding.getRoot(); - 但紧接着你又手动
inflate了另一个相同布局的View:View view = inflater.inflate(R.layout.fragment_weight, container, false); - 你从这个多余的
view里找到了addBtn并设置了点击事件,但最后返回的却是root(Binding对应的根视图)。这就导致你设置了事件的按钮根本不在屏幕上,自然点击没反应。
另外还有个小bug:你在onCreateView里就获取了edtNumber的文本,这时候用户还没输入任何内容,Toast会一直显示空值,得把获取文本的逻辑移到点击事件里。
修复后的代码
public class WeightFragment extends Fragment { private FragmentWeightBinding binding; private EditText edtNumber; private Button addBtn; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { WeightViewModel weightViewModel = new ViewModelProvider(this).get(WeightViewModel.class); binding = FragmentWeightBinding.inflate(inflater, container, false); View root = binding.getRoot(); // 直接通过Binding获取控件,无需手动findViewById addBtn = binding.addBtn; edtNumber = binding.edtNumber; addBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 点击时才获取用户输入的内容 String weight = String.valueOf(edtNumber.getText()); SimpleDateFormat sdf = new SimpleDateFormat("'Date\n'dd-MM-yyyy HH:mm:ss"); String currentDateAndTime = sdf.format(new Date()); Toast.makeText(getActivity(), weight + "\n" + currentDateAndTime, Toast.LENGTH_SHORT).show(); } }); final TextView textView = binding.txtDate; weightViewModel.getText().observe(getViewLifecycleOwner(), textView::setText); return root; } @Override public void onDestroyView() { super.onDestroyView(); binding = null; } }
额外说明
如果你想用实现View.OnClickListener接口的方式,也要确保是从Binding对象里获取控件,而不是手动inflate的View。示例如下:
public class WeightFragment extends Fragment implements View.OnClickListener { private FragmentWeightBinding binding; private EditText edtNumber; private Button addBtn; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { WeightViewModel weightViewModel = new ViewModelProvider(this).get(WeightViewModel.class); binding = FragmentWeightBinding.inflate(inflater, container, false); View root = binding.getRoot(); addBtn = binding.addBtn; edtNumber = binding.edtNumber; addBtn.setOnClickListener(this); // 设置点击监听为当前Fragment final TextView textView = binding.txtDate; weightViewModel.getText().observe(getViewLifecycleOwner(), textView::setText); return root; } @Override public void onClick(View v) { if(v.getId() == R.id.addBtn){ String weight = String.valueOf(edtNumber.getText()); SimpleDateFormat sdf = new SimpleDateFormat("'Date\n'dd-MM-yyyy HH:mm:ss"); String currentDateAndTime = sdf.format(new Date()); Toast.makeText(getActivity(), weight + "\n" + currentDateAndTime, Toast.LENGTH_SHORT).show(); } } @Override public void onDestroyView() { super.onDestroyView(); binding = null; } }
这样修改后,按钮就能正常响应点击啦~
内容的提问来源于stack exchange,提问作者netti169
相关产品推荐
相关产品推荐

