152 votes

Android P visibilityawareimagebutton.setVisibility ne peut être appelé que depuis le même groupe de bibliothèque

Je suis en train d'essayer d'utiliser le nouveau FloatingActionButton d'Android P qui fait partie de com.google.android.material.floatingactionbutton.FloatingActionButton et je reçois cet avertissement :

VisibilityAwareImageButton.setVisibility ne peut être appelé que depuis le même groupe de bibliothèque (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  // l'avertissement est ici
    }
}

entrer la description de l'image ici

J'ai essayé de chercher et le seul résultat de la recherche concerne la réponse aux changements de visibilité de l'interface utilisateur :

Répondre aux changements de visibilité de l'interface utilisateur

J'ai essayé d'explorer pour voir s'il y avait une valeur int VISIBLE dans ce package com.google.android.material et la seule que j'ai trouvée était com.google.android.material.floatingactionbutton.FloatingActionButton.VISIBLE, mais l'avertissement reste encore.

build.gradle au niveau supérieur

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 : Ne placez pas vos dépendances d'application ici ; elles appartiennent
        // aux fichiers build.gradle de module individuels
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
        maven { url "http://oss.sonatype.org/content/repositories/snapshots/" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

build.gradle au niveau du projet

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'
}

éditer :

Je devrais noter que j'utilise Android Studio version 3.2 canary 14. Il semble qu'il y ait eu des bugs signalés pour cette version, et je pense que celui-ci en fait partie.

éditer 2 :

Le problème persiste avec Android Studio version 3.2 canary 15, mais j'ai trouvé une solution de contournement en utilisant show() et hide()

override fun onCreate(savedInstanceState: Bundle?) {
    demoFab = findViewById(R.id.demoFab)
    demoFab.show()    // cela fonctionne et n'a pas l'avertissement
}

0 votes

Le package correct est android.support.design.widget.FloatingActionButton

0 votes

Avec Android P et Jetpack, le Fab a été déplacé vers ce package, c'est celui que j'essaie d'utiliser. developer.android.com/reference/com/google/android/material/‌​…

0 votes

@KyleFalconer Canary 15 est maintenant disponible, vérifiez si la mise à jour peut résoudre votre problème :)

278voto

Akhila Madari Points 2780

Utilisation de la méthode 1

demoFab.show(); // à la place de visible
demoFab.hide(); // à la place de Invisible, supprimez le warning/erreur pour moi.

et la méthode 2

@SuppressLint("RestrictedApi") // supprime également le warning
private void setUp() {
    ....
}

mise à jour :

Méthode 3 :

demoFab.setVisibility(View.GONE);
demoFab.setVisibility(View.INVISIBLE);
demoFab.setVisibility(View.VISIBLE);

Méthode 4 :

demoFab.visibility = View.GONE
demoFab.visibility = View.INVISIBLE
demoFab.visibility = View.VISIBLE

2 votes

Cela ajoute également une belle animation!

1 votes

Salut, y a-t-il des méthodes GONE et INVISIBLE ?

0 votes

En utilisant .show() peut supprimer l'avertissement, mais il y a un problème : si le FAB a défini, par exemple en XML, android:alpha="0.5" pour la transparence, alors la transparence ne fonctionne pas. Comment résoudre ce problème ?Au lieu de cela, je préférerais utiliser demoFab.visibility = View.VISIBLE si .show() ne fonctionne pas sur android:alpha.

10voto

Andreas Points 810

Semble fonctionner correctement juste en le convertissant en vue.

(mFloatingActionButton as View).visibility = INVISIBLE

Bien sûr, vous devez vous rappeler que la visibilité peut affecter d'autres composants, donc vous devriez probablement utiliser show() et hide() en même temps pour vous assurer que les autres composants sont notifiés du changement.

5 votes

Qu'en est-il si je veux définir la visibilité sur GONE au lieu de INVISIBLE?

1 votes

@charlie Quelle différence attendez-vous entre GONE et INVISIBLE d'un bouton d'action flottant ? Un bouton d'action flottant se trouve généralement au-dessus du reste de la mise en page donc il ne prend aucun espace.

6voto

RileyManda Points 841

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érifiez si l'utilisateur tape ou a le focus:

 mCommentField.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View view, boolean hasFocus) {
            if (hasFocus) {
                //l'utilisateur a le focus
                showBts();

            } else {
                //le focus s'est arrêté, effectuez votre action désirée
                hideButtons();
            }
        }

    });

Méthodes pour Masquer et Afficher les boutons:

private void hideButtons() {

    mCommentButton.hide();
    mClearButton.hide();
}

private void showBts() {

    mCommentButton. show();
    mClearButton.show();

Et dans votre fichier xml, définissez les boutons comme invisibles par défaut afin qu'ils ne s'affichent que lorsque l'utilisateur a le focus ou tape:

android:visibility="invisible"

Meilleure pratique:

android:visibility="Gone"

Utiliser la visibilité "Gone" signifie que votre vue ne prend pas de place sur votre mise en page alors que "invisible" prendra de la place inutilement sur votre mise en page

Dans cet exemple: Mes vues sont dans un ViewHolder et je fais référence aux boutons depuis un fragment avec un recyclerview

3voto

vcdo Points 31

Cela fonctionne également :

findViewById(R.id.fab).setVisibility(View.GONE);

0 votes

Oui c'est ça. J'utilisais un fragment dans mon exemple : setVisibility(View.GONE); ne fonctionne pas toujours dans les fragments, surtout lorsque vous avez déclaré vos vues dans un viewHolder qui se trouve dans une classe séparée et que vous les référencez simplement depuis le ViewHolder.

0voto

Kevin Points 158

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 et cela offre la souplesse pour n'importe quel état de visibilité tout en prenant en compte une liste de vues à manipuler. Il y a beaucoup de fois où j'ai besoin de manipuler plus d'une vue à la fois comme le montre la dernière ligne de l'exemple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X