web-dev-qa-db-fra.com

Android P Visibileawareimagebutton.setVisibility peut uniquement être appelé à partir du même groupe de bibliothèques

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

 enter image description 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.

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

modifier:

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.

éditer 2:

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
}
58
Kyle Falconer

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

Cela fonctionne aussi:

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

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.

1
Andreas

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.

0
Kevin

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"
0
RileyManda
if(data){
            fragmentPendingApprovalDetailsBinding.fabPendingList.show();
        }else {
            fragmentPendingApprovalDetailsBinding.fabPendingList.hide();
        }
0
Soumen Das