主FAB点击正常,子FAB无响应?Android FAB点击事件问题求助
子FAB点击无响应的问题根源与修复方案
嘿,我一眼就揪出你代码里的关键问题啦——你在显示子FAB的方法里错误地执行了移除点击事件的操作!
问题核心
你在showFABMenu()方法里写了这两行代码:
fab_house.setOnClickListener(null); fab_Building.setOnClickListener(null);
这直接把你之前在全局代码里给子FAB绑定好的OnClickListener给清空了!哪怕你提前给fab_house和fab_Building设置了点击逻辑,这两行代码一执行,它们的点击事件就被彻底移除,子FAB自然完全没响应。
修复方案
正如你自己发现的,这两行代码放错了函数位置。正确的做法是把它们从showFABMenu()里删掉,或者如果你的业务逻辑需要在关闭菜单时清空点击事件,就把它们移到closeFABMenu()方法里。
修正后的showFABMenu()方法应该是这样的:
private void showFABMenu(){ FloatingActionButton fab_main = findViewById(R.id.floating_action_button_main); FloatingActionButton fab_house = findViewById(R.id.floating_action_button_house); FloatingActionButton fab_Building = findViewById(R.id.floating_action_button_building); isFABOpen=true; // 移除这两行错误的置空代码 fab_house.show(); fab_Building.show(); fab_house.animate().translationY(-getResources().getDimension(R.dimen.standard_62)); fab_Building.animate().translationY(-getResources().getDimension(R.dimen.standard_125)); }
额外优化建议
你已经在全局初始化过一次FAB实例了,没必要在showFABMenu()和closeFABMenu()里重复调用findViewById(),把FAB声明为类成员变量会更高效简洁:
// 声明为类成员变量 private FloatingActionButton fab_main; private FloatingActionButton fab_house; private FloatingActionButton fab_Building; private boolean isFABOpen = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); // 只初始化一次 fab_main = findViewById(R.id.floating_action_button_main); fab_house = findViewById(R.id.floating_action_button_house); fab_Building = findViewById(R.id.floating_action_button_building); fab_house.hide(); fab_Building.hide(); fab_main.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(!isFABOpen){ showFABMenu(); }else{ closeFABMenu(); } } }); fab_house.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { closeFABMenu(); // 这里添加你的业务逻辑 } }); fab_Building.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { closeFABMenu(); // 这里添加你的业务逻辑 } }); } private void showFABMenu(){ isFABOpen=true; fab_house.show(); fab_Building.show(); fab_house.animate().translationY(-getResources().getDimension(R.dimen.standard_62)); fab_Building.animate().translationY(-getResources().getDimension(R.dimen.standard_125)); } private void closeFABMenu(){ isFABOpen=false; fab_house.animate().translationY(0); fab_Building.animate().translationY(0); fab_house.hide(); fab_Building.hide(); }
调整后子FAB的点击事件就能正常触发,代码结构也更清晰啦。
内容的提问来源于stack exchange,提问作者Nachum Olman
相关产品推荐
相关产品推荐

