Fragment内Toast失效求助:点击FloatingActionButton无响应
问题分析与解决方案
嘿,刚接触Android开发就能尝试标签页和FAB,已经很棒啦!我一眼就看到了问题所在,这是个新手很容易踩的小坑,咱们一步步来解决:
1. 核心问题:你返回了错误的View对象
看你的onCreateView方法:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 第一步:加载布局到v对象,给FAB设置了点击监听 View v = inflater.inflate(R.layout.fragment_my_list, container, false); FloatingActionButton fab = (FloatingActionButton) v.findViewById(R.id.floatingActionButton); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(getActivity(),"test", Toast.LENGTH_LONG).show(); } }); // 第二步:错误!重新加载了一个全新的布局并返回,之前设置监听的v根本没被用到 return inflater.inflate(R.layout.fragment_my_list, container, false); }
你先把布局加载到v里,给FAB绑定了点击事件,但最后却返回了一个重新inflate的新View——这就相当于你给A按钮加了监听,却把B按钮放到了界面上,自然点击没反应!
2. 关于Toast的第一个参数
先给你吃个定心丸:你用getActivity()作为Toast的第一个参数是完全正确的!Toast需要的是一个Context(上下文),Fragment本身没有独立的上下文,getActivity()会获取到当前Fragment所在的Activity的上下文,完全符合要求。之前Toast没弹出来,只是因为点击事件根本没被触发,不是参数的问题~
3. 修正后的代码
只需要把return语句改成返回你已经设置好监听的v对象就行:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_my_list, container, false); FloatingActionButton fab = (FloatingActionButton) v.findViewById(R.id.floatingActionButton); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(getActivity(),"test", Toast.LENGTH_LONG).show(); } }); // 改成返回已经设置好监听的v return v; }
额外小提示
- 你的XML里已经给FAB设置了
android:clickable="true",这个没问题,不用改; - 如果你的项目支持Java 8及以上,还可以用Lambda简化点击事件代码,看起来更清爽:
fab.setOnClickListener(view -> Toast.makeText(getActivity(), "test", Toast.LENGTH_LONG).show());
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

