使用Android P的Material FloatingActionButton遇Visibility调用警告问题
问题场景
在使用Android P版本的com.google.android.material.floatingactionbutton.FloatingActionButton时,直接通过代码设置可见性会触发Lint警告:
VisibilityAwareImageButton.setVisibility can only be called from the same library group (groupId=com.google.android.material)
触发警告的代码示例:
import com.google.android.material.floatingactionbutton.FloatingActionButton import android.view.View class MainActivity : AppCompatActivity() { lateinit var demoFab: FloatingActionButton override fun onCreate(savedInstanceState: Bundle?) { demoFab = findViewById(R.id.demoFab) demoFab.visibility = View.VISIBLE // 此处触发警告 } }
问题根源
Material Design的FloatingActionButton继承自内部类VisibilityAwareImageButton,这个类的setVisibility方法被标记为仅允许com.google.android.material库内部调用,所以我们在应用代码中直接调用就会触发Lint的访问限制警告。
可行解决方案
官方已经为FloatingActionButton提供了专门的可见性控制方法,完全可以替代直接设置visibility:
- 用
show()方法替代View.VISIBLE - 用
hide()方法替代View.INVISIBLE
修改后的无警告代码:
override fun onCreate(savedInstanceState: Bundle?) { demoFab = findViewById(R.id.demoFab) demoFab.show() // 无警告且功能正常 }
如果你的场景确实需要设置View.GONE状态(hide()仅对应INVISIBLE),可以继续使用demoFab.visibility = View.GONE,同时添加Lint忽略注释消除警告:
// noinspection RestrictedApi demoFab.visibility = View.GONE
附项目Gradle配置参考
Top-level build.gradle
buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.2.0-alpha15' // 其他项目依赖 } } allprojects { repositories { google() jcenter() } }
Project-level build.gradle
apply plugin: 'com.android.application' android { compileSdkVersion 'android-P' defaultConfig { applicationId "com.yourpackage.name" minSdkVersion 21 targetSdkVersion 'P' versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation 'com.google.android.material:material:1.0.0-alpha1' implementation 'androidx.appcompat:appcompat:1.0.0-alpha1' // 其他模块依赖 }
内容的提问来源于stack exchange,提问作者Kyle Falconer
相关产品推荐
相关产品推荐

