O Android P visibleawareimagebutton.setVisibility pode ser chamado apenas do mesmo grupo de bibliotecas

143

Estou tentando usar o novo Android P FloatingActionButton que faz parte do com.google.android.material.floatingactionbutton.FloatingActionButtone estou recebendo este aviso:

VisibilityAwareImageButton.setVisibility só pode ser chamado do mesmo 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
    }
}

insira a descrição da imagem aqui

Tentei pesquisar e o único resultado da pesquisa diz respeito a responder às alterações de visibilidade da interface do usuário:

Responder a alterações de visibilidade da interface do usuário

Tentei explorar como pude ver se havia um VISIBLEvalor int nesse com.google.android.materialpacote e o único que encontrei foi com.google.android.material.floatingactionbutton.FloatingActionButton.VISIBLE, mas o aviso ainda permanece.

Build.gradle de nível 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
}

Build.gradle no nível do projeto

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:

Devo observar que estou usando o canário 14. do Android Studio versão 3.2. Parece que houve alguns bugs relatados para esta versão e suspeito que esse seja um deles.

editar 2:

Ainda existe um problema com o Android Studio versão 3.2 canary 15, mas encontrei uma solução alternativa para ele usando show()ehide()

override fun onCreate(savedInstanceState: Bundle?) {
    demoFab = findViewById(R.id.demoFab)
    demoFab.show()    // this works and doesn't have the warning
}
Kyle Falconer
fonte
O pacote correto é android.support.design.widget.FloatingActionButton
Pankaj Kumar 15/18
Com o Android P e o Jetpack, o Fab foi movido para este pacote, é o que estou tentando usar. developer.android.com/reference/com/google/android/material/…
Kyle Falconer
@KyleFalconer Canary 15 está agora disponível, verificar se a atualização pode resolver o seu problema :)
Levi Moreira
2
@PankajKumar Yup, ainda está quebrado, mas encontrei outra solução alternativa para isso (adicionada "edição 2" à minha pergunta).
Kyle Falconer
5
Esse problema descreve o bug: issuetracker.google.com/issues/115924750 Infelizmente, não há solução ou correção do atm; portanto, provavelmente todos os afetados devem estrelá-lo.
ChristophK

Respostas:

266

Usando o método 1

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

e método 2

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

atualizar:

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
fonte
2
Isso também adiciona uma bela animação!
ror
1
oi, existem métodos GONE e INVISIBLE?
Siarhei
O uso de .show () pode remover o aviso, mas há um problema: se o FAB tiver definido, por exemplo, em XML, android: alpha = "0.5" para transparência, a transparência não funcionará. Como consertar esse problema? Em vez disso, vou preferir usar demoFab.visibility = View.VISIBLE se .mostrar () não pode trabalhar no android: alpha
Fisher
Os métodos show e hide são perfeitos para botões de ação flutuantes padrão.
precisa
9

Parece funcionar bem apenas para exibi-lo.

(mFloatingActionButton as View).visibility = INVISIBLE

É claro que você precisa se lembrar de que a visibilidade pode afetar outros componentes; portanto, você provavelmente deve usar show()e hide()ao mesmo tempo para garantir que outros componentes sejam notificados da alteração.

Andreas
fonte
5
e se eu quiser definir a visibilidade como GONE em vez de INVISIBLE?
charlie
1
@charlie Que diferença você espera entre GONE e INVISIBLE de um botão de ação flutuante? Um fab geralmente fica acima do restante do layout, para não ocupar espaço.
O incrível
6

Usar:

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

Um exemplo típico seria:

Ocultando e mostrando botões quando o usuário está digitando ou se concentra em um recurso EditText:

verifique se o usuário está digitando ou tem o 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 e mostrar métodos de botão:

private void hideButtons() {

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

private void showBts() {

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

E no seu xml, defina os botões como invisíveis por padrão, para que sejam exibidos / exibidos apenas quando um usuário estiver focado ou digitando:

android:visibility="invisible"

Melhor prática:

 android:visibility="Gone"

Usar a visibilidade perdida significa que sua visualização não ocupa espaço no layout, enquanto "invisível" ocupa espaço desnecessário no layout

Neste exemplo: Minhas vistas estão em um ViewHolder e iam referenciando os botões de um fragmento com uma visualização de recylerview

RileyManda
fonte
3

Isso também funciona:

findViewById(R.id.fab).setVisibility(View.GONE);
vcdo
fonte
Sim. Eu estava usando um fragmento no meu exemplo: setVisibility (View.GONE); nem sempre funciona em fragmentos, especialmente quando você declara seus pontos de vista em um viewHolder que está em uma classe separada própria e você está apenas referenciando o Viewholder.
RileyManda
0

Para o Kotlin, eu tenho um método de extensão

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

Em seguida, no código, você pode fazer o seguinte

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

O erro desapareceu e isso oferece flexibilidade para qualquer estado de visibilidade, além de incluir uma lista de visualizações para lidar. Muitas vezes eu preciso lidar com mais de uma visualização de cada vez, como mostra a linha de exemplo final.

Kevin
fonte
0
if(data){
            fragmentPendingApprovalDetailsBinding.fabPendingList.show();
        }else {
            fragmentPendingApprovalDetailsBinding.fabPendingList.hide();
        }
Soumen Das
fonte
0

Para com.google.android.material.floatingactionbutton.FloatingActionButton

Visibilidade

Use os métodos show and hide para animar a visibilidade de um FloatingActionButton. A animação do show aumenta o widget e o reduz, enquanto a animação oculta reduz o widget e diminui.

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

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

tanni tanna
fonte
0

Para mim, os métodos acima não funcionaram, então criei uma função de extensão para fazê-lo funcionar.

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

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

agora ligue como

binding.fabAdded.showView()
Vikas Kumar
fonte