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
}
Kyle Falconer
fuente
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
Akhila Madari
fuente
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.

Andreas
fuente
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

RileyManda
fuente
3

Esto también funciona:

findViewById(R.id.fab).setVisibility(View.GONE);
vcdo
fuente
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.

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

tanni tanna
fuente
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()
vikas kumar
fuente