Android P visibilitéawareimagebutton.setVisibility ne peut être appelé qu'à partir du même groupe de bibliothèques


143

J'essaie d'utiliser le nouvel Android P FloatingActionButton qui fait partie du com.google.android.material.floatingactionbutton.FloatingActionButtonet 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
    }
}

entrez la description de l'image ici

J'ai essayé la recherche 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 comment je pourrais voir s'il y avait une VISIBLEvaleur int dans ce com.google.android.materialpaquet et la seule que j'ai trouvée l'était com.google.android.material.floatingactionbutton.FloatingActionButton.VISIBLE, mais l'avertissement demeure.

Build.gradle de 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: 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
}

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 dois noter que j'utilise Android Studio version 3.2 canary 14. Il semble qu'il y ait eu des bogues rapportés pour cette version, et je soupçonne que c'est l'un d'entre eux.

modifier 2:

Le problème existe toujours avec Android Studio version 3.2 canary 15, mais j'ai trouvé une solution de contournement pour cela en utilisant show()ethide()

override fun onCreate(savedInstanceState: Bundle?) {
    demoFab = findViewById(R.id.demoFab)
    demoFab.show()    // this works and doesn't have the warning
}

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

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/…
Kyle Falconer

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

2
@PankajKumar Yup, toujours cassé, mais j'ai trouvé une autre solution de contournement pour cela (j'ai ajouté "edit 2" à ma question).
Kyle Falconer

5
Ce problème décrit le bogue: issuetracker.google.com/issues/115924750 Malheureusement, il n'y a pas de solution ou de correction d'atm, donc probablement tous ceux qui sont affectés devraient le mettre en étoile.
ChristophK

Réponses:


266

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() {
    ....
}

mettre à 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
Cela ajoute également une belle animation!
ror

1
salut, y a-t-il des méthodes GONE et INVISIBLE?
Siarhei

Utiliser .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, la transparence ne fonctionne pas alors. Comment résoudre ce problème? Au lieu de cela, je préférerai utiliser demoFab.visibility = View.VISIBLE si .show () ne peut pas fonctionner sur android: alpha
Fisher

Les méthodes show et hide sont parfaites pour les boutons d'action flottants standard.
FirestormXYZ

9

Semble bien fonctionner juste pour le convertir en 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 informés du changement.


5
Et si je veux définir la visibilité sur GONE au lieu de INVISIBLE?
charlie

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

6

Utilisation:

 myButton.hide();
 myClearButton.hide();

Un exemple typique serait:

Masquage et affichage des boutons lorsque l'utilisateur tape ou se concentre 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();
            }
        }


    });

Masquer et afficher les méthodes des boutons:

private void hideButtons() {

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

private void showBts() {

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

Et dans votre xml, définissez les boutons sur invisibles par défaut afin qu'ils ne s'affichent / ne s'affichent que lorsqu'un utilisateur a le focus ou est en train de taper:

android:visibility="invisible"

Meilleur entrainement:

 android:visibility="Gone"

L'utilisation de la visibilité disparue signifie que votre vue ne prend pas de place sur votre mise en page tandis que "invisible" occupera de l'espace inutile sur votre mise en page

Dans cet exemple: Mes vues sont dans un ViewHolder et iam référençant les boutons d'un fragment avec une recylerview


3

Cela fonctionne également:

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

Oui, j'utilisais un fragment dans mon exemple: setVisibility (View.GONE); ne fonctionne pas toujours dans les fragments, en particulier lorsque vous avez déclaré vos vues dans un viewHolder qui se trouve dans une classe distincte et que vous faites simplement référence à partir du Viewholder.
RileyManda

0

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 aura disparu et cela donne la flexibilité pour n'importe quel état de visibilité ainsi que la prise d'une liste de vues à gérer. Il y a de nombreuses fois où j'ai besoin de gérer plus d'une vue à la fois, comme indiqué dans la dernière ligne d'exemple.


0
if(data){
            fragmentPendingApprovalDetailsBinding.fabPendingList.show();
        }else {
            fragmentPendingApprovalDetailsBinding.fabPendingList.hide();
        }

0

Pour com.google.android.material.floatingactionbutton.FloatingActionButton

Visibilité

Utilisez les méthodes show et hide pour animer la visibilité d'un FloatingActionButton. L'animation de spectacle agrandit le widget et l'aompe, tandis que l'animation de masquage réduit le widget et le fait disparaître.

Source: https://material.io/develop/android/components/floating-action-button/

Pour android.support.design.widget.FloatingActionButton utiliser la setVisibility()méthode


0

Pour moi, les méthodes ci-dessus ne fonctionnaient pas, j'ai donc créé une fonction d'extension pour la faire fonctionner.

fun View.showView() {
    this.visibility = View.VISIBLE
}

fun View.hideView() {
    this.visibility = View.GONE
}

maintenant appelle comme

binding.fabAdded.showView()
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.