J'essaie d'utiliser le nouvel Android P FloatingActionButton qui fait partie du com.google.Android.material.floatingactionbutton.FloatingActionButton
et je reçois cet avertissement:
VisibilityAwareImageButton.setVisibility ne peut être appelé qu'à partir du même groupe de bibliothèques (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 // the warning is here
}
}
J'ai essayé de chercher et le seul résultat de recherche concerne la réponse aux changements de visibilité de l'interface utilisateur:
https://developer.Android.com/training/system-ui/visibility
J'ai essayé d'explorer comment je pouvais voir s'il y avait une valeur VISIBLE
int dans ce paquetage com.google.Android.material
, et le seul que j'ai trouvé était com.google.Android.material.floatingactionbutton.FloatingActionButton.VISIBLE
, mais l'avertissement demeure.
buildscript {
ext.kotlin_version = '1.2.41'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.Android.tools.build:gradle:3.2.0-alpha14'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "com.google.gms:oss-licenses:0.9.2"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
mavenCentral()
maven { url "http://oss.sonatype.org/content/repositories/snapshots/" }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
apply plugin: 'com.Android.application'
apply plugin: 'kotlin-Android'
apply plugin: 'kotlin-Android-extensions'
apply plugin: 'com.google.gms.oss.licenses.plugin'
Android {
compileSdkVersion 'Android-P'
defaultConfig {
applicationId "com.codeforsanjose.maps.pacmap"
minSdkVersion 21
targetSdkVersion 'P'
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
splits {
abi {
enable true
reset()
include 'arm64-v8a', 'armeabi', 'armeabi-v7a', 'mips', 'x86', 'x86_64'
universalApk false
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.0-alpha1'
implementation 'androidx.constraintlayout:constraintlayout:1.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.0-alpha2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha2'
implementation 'com.mapbox.mapboxsdk:mapbox-Android-sdk:5.5.2'
//implementation 'com.mapbox.mapboxsdk:mapbox-Android-sdk:6.1.0'
implementation 'com.mapbox.mapboxsdk:mapbox-Android-plugin-locationlayer:0.5.0'
implementation 'com.mapbox.mapboxsdk:mapbox-Android-navigation:0.13.0'
implementation 'com.mapbox.mapboxsdk:mapbox-Android-navigation-ui:0.13.0'
implementation 'com.google.Android.gms:play-services-oss-licenses:15.0.1'
implementation 'com.google.code.gson:gson:2.8.2'
implementation 'com.squareup.moshi:moshi:1.5.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.retrofit2:converter-moshi:2.4.0'
implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxkotlin:2.2.0'
}
Je dois noter que j'utilise le canary 14 d'Android Studio version 3.2. Il semble que certains bugs aient été signalés pour cette version, et je suppose que c'est l'un d'entre eux.
Le problème existe toujours avec Android Studio version 3.2 Canary 15, mais j'ai trouvé une solution de contournement à l'aide de show()
et hide()
.
override fun onCreate(savedInstanceState: Bundle?) {
demoFab = findViewById(R.id.demoFab)
demoFab.show() // this works and doesn't have the warning
}
Utilisation de la méthode 1
demoFab.show(); // in place of visible
demoFab.hide(); // in place of Invisible suppress the warning/error for me.
et méthode 2
@SuppressLint("RestrictedApi") // also suppressed the warning
private void setUp() {
....
}
Cela fonctionne aussi:
findViewById(R.id.fab).setVisibility(View.GONE);
Semble fonctionner correctement pour le projeter dans une vue.
(mFloatingActionButton as View).visibility = INVISIBLE
Bien sûr, vous devez vous rappeler que la visibilité peut affecter d'autres composants, vous devez donc probablement utiliser show()
et hide()
en même temps pour vous assurer que les autres composants sont avertis du changement.
Pour Kotlin, j'ai une méthode d'extension
fun viewsVisibility(visibility: Int, vararg views: View) {
for (view in views) { view.visibility = visibility }
}
Ensuite, dans le code, vous pouvez faire ce qui suit
viewsVisibility(View.VISIBLE, demoFab)
viewsVisibility(View.GONE, demoFab)
viewsVisibility(View.INVISIBLE, demoFab, addFab, removeFab)
L'erreur disparaîtra, ce qui offre la souplesse nécessaire pour tout état de visibilité et permet de gérer une liste de vues à gérer. Comme souvent dans la dernière ligne droite, je dois gérer plusieurs vues à la fois.
Utilisation:
myButton.hide();
myClearButton.hide();
Un exemple typique serait:
Masquer et afficher les boutons lorsque l'utilisateur tape ou a le focus sur une ressource EditText:
vérifier si l'utilisateur tape ou a le focus:
mCommentField.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean hasFocus) {
if (hasFocus) {
//user has focused
showBts();
} else {
//focus has stopped perform your desired action
hideButtons();
}
}
});
Méthodes de bouton Masquer et afficher:
private void hideButtons() {
mCommentButton.hide();
mClearButton.hide();
}
private void showBts() {
mCommentButton. show();
mClearButton.show();
Et dans votre xml, définissez les boutons sur Invisible par défaut pour qu’ils ne s'affichent/affichent que lorsqu'un utilisateur est actif ou tape:
Android:visibility="invisible"
if(data){
fragmentPendingApprovalDetailsBinding.fabPendingList.show();
}else {
fragmentPendingApprovalDetailsBinding.fabPendingList.hide();
}