Android P visibilidadawareimagebutton.setVisibility solo se puede llamar desde el mismo grupo de biblioteca


143

Estoy tratando de usar el nuevo Android P FloatingActionButton que es parte del com.google.android.material.floatingactionbutton.FloatingActionButtony recibo esta advertencia:

VisibilityAwareImageButton.setVisibility solo se puede llamar desde el mismo grupo de bibliotecas (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
    }
}

ingrese la descripción de la imagen aquí

Intenté buscar y el único resultado de la búsqueda es responder a los cambios de visibilidad de la interfaz de usuario:

Responder a los cambios de visibilidad de la interfaz de usuario

Traté de explorar cómo pude ver si había un VISIBLEvalor int en ese com.google.android.materialpaquete y el único que encontré fue com.google.android.material.floatingactionbutton.FloatingActionButton.VISIBLE, pero la advertencia aún permanece.

Build.gradle de nivel superior

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
}

Nivel de proyecto build.gradle

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

editar:

Debo señalar que estoy usando Android Studio versión 3.2 canary 14. Parece que ha habido algunos errores reportados para esta versión, y sospecho que este es uno de ellos.

editar 2:

El problema todavía existe con Android Studio versión 3.2 canario 15, pero encontré una solución para esto usando show()yhide()

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

El paquete correcto es android.support.design.widget.FloatingActionButton
Pankaj Kumar

Con Android P y Jetpack, el Fab se movió a este paquete, ese es el que estoy tratando de usar. developer.android.com/reference/com/google/android/material/…
Kyle Falconer

@KyleFalconer Canary 15 ya está disponible, verifique si la actualización puede solucionar su problema :)
Levi Moreira

2
@PankajKumar Sí, todavía está roto, pero encontré otra solución (agregué "edit 2" a mi pregunta).
Kyle Falconer

55
Este problema describe el error: issuetracker.google.com/issues/115924750 Lamentablemente, no hay una solución o un cajero automático fijo, por lo que probablemente todos los afectados deberían destacarlo .
ChristophK

Respuestas:


266

Usando el Método 1

demoFab.show(); // in place of visible
demoFab.hide(); // in place of Invisible suppress the warning/error for me.

y Método 2

@SuppressLint("RestrictedApi") // also suppressed the warning
private void setUp() {
    ....
}

actualizar:

Método 3:

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

Método 4:

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

2
¡Esto también agrega una hermosa animación!
ror

1
hola, ¿hay métodos IDOS e INVISIBLES?
Siarhei

El uso de .show () puede eliminar la advertencia, pero hay un problema: si la FAB ha configurado, por ejemplo, en XML, android: alpha = "0.5" para transparencia, entonces la transparencia no funciona. ¿Cómo arreglar este problema? En cambio, preferiré usar demoFab.visibility = View.VISIBLE si .show () no funciona en android: alpha
Fisher

Los métodos show y hide son perfectos para los botones de acción flotante estándar.
FirestormXYZ

9

Parece funcionar bien solo para echarlo a la vista.

(mFloatingActionButton as View).visibility = INVISIBLE

Por supuesto, debe recordar que la visibilidad puede afectar a otros componentes, por lo que probablemente debería usar show()y hide()al mismo tiempo asegurarse de que otros componentes sean notificados del cambio.


55
¿Qué pasa si quiero establecer la visibilidad en GONE en lugar de INVISIBLE?
Charlie

1
@charlie ¿Qué diferencia esperas entre GONE e INVISIBLE de un botón de acción flotante? Una fabulosa generalmente se encuentra por encima del resto del diseño, por lo que no ocupa espacio.
El increíble

6

Utilizar:

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

Un ejemplo típico sería:

Ocultar y mostrar botones cuando el usuario está escribiendo o se centra en un recurso EditText:

Compruebe si el usuario está escribiendo o tiene el foco:

 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();
            }
        }


    });

Ocultar y mostrar métodos de botón:

private void hideButtons() {

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

private void showBts() {

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

Y en su xml, configure los botones como invisibles de manera predeterminada para que solo se muestren / muestren cuando un usuario tiene el foco o está escribiendo:

android:visibility="invisible"

Mejores prácticas:

 android:visibility="Gone"

Usar la visibilidad desaparecida significa que su vista no ocupará espacio en su diseño, mientras que "invisible" ocupará espacio innecesario en su diseño

En este ejemplo: Mis vistas están en un ViewHolder y iam haciendo referencia a los botones de un fragmento con una vista de reciclador


3

Esto también funciona:

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

Sí. Estaba usando un fragmento en mi ejemplo: setVisibility (View.GONE); no siempre funciona en fragmentos, especialmente cuando ha declarado sus vistas en un viewHolder que se encuentra en una clase separada y solo hace referencia al Viewholder.
RileyManda

0

Para Kotlin tengo un método de extensión

fun viewsVisibility(visibility: Int, vararg views: View) {
    for (view in views) { view.visibility = visibility }
}

Luego, en el código, puede hacer lo siguiente

viewsVisibility(View.VISIBLE, demoFab) 
viewsVisibility(View.GONE, demoFab)
viewsVisibility(View.INVISIBLE, demoFab, addFab, removeFab)

El error desaparecerá y esto brinda la flexibilidad para cualquier estado de visibilidad junto con una lista de vistas para manejar. Hay muchas veces que necesito manejar más de una vista a la vez como se muestra en la línea de ejemplo final.


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

0

por com.google.android.material.floatingactionbutton.FloatingActionButton

Visibilidad

Use los métodos show y hide para animar la visibilidad de un FloatingActionButton. La animación del programa aumenta el widget y lo desvanece, mientras que la animación oculta lo reduce y lo desvanece.

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

Para android.support.design.widget.FloatingActionButton uso setVisibility()Método


0

Para mí, los métodos anteriores no funcionaron, así que creé una función de extensión para que funcione.

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

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

ahora llama como

binding.fabAdded.showView()
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.