Material Design 3 SearchView展开时FloatingActionButton未隐藏问题求助
方案一:通过SearchView状态监听实现(Activity代码)
在Activity中给SearchView添加状态监听器,监听展开/折叠事件,控制FloatingActionButton的显示与隐藏:
Kotlin 代码示例
class MainActivity2 : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.your_layout_name) val searchView = findViewById<SearchView>(R.id.search_view) val fab = findViewById<FloatingActionButton>(R.id.floating_action_button) searchView.addOnSearchViewListener(object : SearchView.OnSearchViewListener { override fun onSearchViewShown() { fab.hide() } override fun onSearchViewClosed() { fab.show() } }) // 关联SearchBar与SearchView,确保状态监听生效 val searchBar = findViewById<SearchBar>(R.id.search_bar) searchBar.setupWithSearchView(searchView) } }
Java 代码示例
public class MainActivity2 extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout_name); SearchView searchView = findViewById(R.id.search_view); FloatingActionButton fab = findViewById(R.id.floating_action_button); searchView.addOnSearchViewListener(new SearchView.OnSearchViewListener() { @Override public void onSearchViewShown() { fab.hide(); } @Override public void onSearchViewClosed() { fab.show(); } }); SearchBar searchBar = findViewById(R.id.search_bar); searchBar.setupWithSearchView(searchView); } }
方案二:通过CoordinatorLayout Behavior实现(XML+自定义Behavior)
通过自定义CoordinatorLayout Behavior,让FAB与SearchView的状态联动,无需在Activity中编写监听代码:
- 创建自定义Behavior类
class SearchViewFabBehavior(context: Context, attrs: AttributeSet) : FloatingActionButton.Behavior(context, attrs) { override fun layoutDependsOn(parent: CoordinatorLayout, child: FloatingActionButton, dependency: View): Boolean { return dependency is SearchView } override fun onDependentViewChanged(parent: CoordinatorLayout, child: FloatingActionButton, dependency: View): Boolean { val searchView = dependency as SearchView if (searchView.isShowing) { child.hide() } else { child.show() } return super.onDependentViewChanged(parent, child, dependency) } }
- 在布局XML中给FAB绑定该Behavior
<com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/floating_action_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="16dp" android:contentDescription="添加联系人" app:srcCompat="@drawable/round_person_add_alt_24" app:layout_behavior=".SearchViewFabBehavior" tools:ignore="ContentDescription,HardcodedText" />
注意事项
- 使用
fab.hide()/fab.show()会自带Material Design标准的淡入淡出动画,比直接设置visibility更符合设计规范。 - 确保项目依赖最新版本的Material Design 3库,避免API兼容问题。
内容的提问来源于stack exchange,提问作者Jay Dolar
相关产品推荐
相关产品推荐

