Android P Sichtbarkeit bewusst Bildbutton.setVisibility kann nur von derselben Bibliotheksgruppe aufgerufen werden


142

Ich versuche, den neuen Android P FloatingActionButton zu verwenden, der Teil von ist, com.google.android.material.floatingactionbutton.FloatingActionButtonund ich erhalte die folgende Warnung:

VisibilityAwareImageButton.setVisibility kann nur von derselben Bibliotheksgruppe aufgerufen werden (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
    }
}

Geben Sie hier die Bildbeschreibung ein

Ich habe versucht zu suchen und das einzige Suchergebnis bezieht sich auf die Reaktion auf Änderungen der Sichtbarkeit der Benutzeroberfläche:

https://developer.android.com/training/system-ui/visibility

Ich habe versucht herauszufinden, wie ich feststellen kann , ob VISIBLEdieses com.google.android.materialPaket einen int-Wert enthält , und der einzige, den ich gefunden habe, war com.google.android.material.floatingactionbutton.FloatingActionButton.VISIBLE, aber die Warnung bleibt bestehen.

Build.gradle der obersten Ebene

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 auf Projektebene

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

bearbeiten:

Ich sollte beachten, dass ich Android Studio Version 3.2 Canary 14 verwende. Es scheint, dass einige Fehler für diese Version gemeldet wurden, und ich vermute, dass dies einer von ihnen ist.

bearbeiten 2:

Es gibt immer noch ein Problem mit Android Studio Version 3.2 Canary 15, aber ich habe eine Problemumgehung mit show()und gefundenhide()

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

Das richtige Paket ist android.support.design.widget.FloatingActionButton
Pankaj Kumar

Mit Android P und Jetpack wurde das Fab in dieses Paket verschoben, das ich verwenden möchte. developer.android.com/reference/com/google/android/material/…
Kyle Falconer

@ KyleFalconer Canary 15 ist jetzt verfügbar. Überprüfen Sie, ob das Update Ihr Problem beheben kann :)
Levi Moreira

2
@PankajKumar Yup, immer noch kaputt, aber ich habe eine andere Problemumgehung dafür gefunden (meiner Frage wurde "Bearbeiten 2" hinzugefügt).
Kyle Falconer

5
Dieses Problem beschreibt den Fehler: issuetracker.google.com/issues/115924750 Leider gibt es keine Lösung oder Behebung von atm, daher sollte wahrscheinlich jeder Betroffene ihn markieren .
ChristophK

Antworten:


264

Verwenden von Methode 1

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

und Methode 2

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

aktualisieren:

Methode 3:

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

Methode 4:

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

2
Dies fügt auch schöne Animation hinzu!
oder

1
Hallo, gibt es GONE und INVISIBLE Methoden?
Siarhei

Die Verwendung von .show () kann die Warnung entfernen, aber es gibt ein Problem: Wenn das FAB beispielsweise in XML android: alpha = "0.5" für Transparenz festgelegt hat, funktioniert die Transparenz dann nicht. Wie kann ich dieses Problem beheben? Stattdessen werde ich es vorziehen, demoFab.visibility = View.VISIBLE zu verwenden, wenn .show () auf android: alpha
Fisher

Die Methoden zum Ein- und Ausblenden eignen sich perfekt für schwebende Standard-Aktionsschaltflächen.
FirestormXYZ

9

Scheint gut zu funktionieren, nur um es in eine Ansicht zu verwandeln.

(mFloatingActionButton as View).visibility = INVISIBLE

Natürlich müssen Sie daran denken , dass die Sichtbarkeit andere Komponenten beeinflussen kann, so dass Sie wahrscheinlich verwenden sollen , show()und hide()zur gleichen Zeit , um sicherzustellen , andere Komponenten werden benachrichtigt , der Änderung.


5
Was ist, wenn ich die Sichtbarkeit auf GONE anstatt auf UNSICHTBAR setzen möchte?
Charlie

1
@charlie Welchen Unterschied erwarten Sie zwischen GONE und INVISIBLE von einem schwebenden Aktionsknopf? Eine Fabrik liegt normalerweise über dem Rest des Layouts, sodass sie keinen Platz beansprucht.
Der unglaubliche

6

Verwenden:

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

Ein typisches Beispiel wäre:

Ausblenden und Anzeigen von Schaltflächen, wenn der Benutzer tippt oder sich auf eine EditText-Ressource konzentriert:

Überprüfen Sie, ob der Benutzer tippt oder den Fokus hat:

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


    });

Methoden zum Ausblenden und Anzeigen von Schaltflächen:

private void hideButtons() {

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

private void showBts() {

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

Setzen Sie in Ihrer XML-Datei die Schaltflächen standardmäßig auf unsichtbar, damit sie nur angezeigt / angezeigt werden, wenn ein Benutzer den Fokus hat oder tippt:

android:visibility="invisible"

Beste Übung:

 android:visibility="Gone"

Wenn Sie die Sichtbarkeit nicht mehr verwenden, nimmt Ihre Ansicht keinen Platz in Ihrem Layout ein, während "unsichtbar" unnötigen Platz in Ihrem Layout einnimmt

In diesem Beispiel: Meine Ansichten befinden sich in einem ViewHolder und ich verweise auf die Schaltflächen eines Fragments mit einer erneuten Ansicht


3

Dies funktioniert auch:

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

Ja, in meinem Beispiel habe ich ein Fragment verwendet: setVisibility (View.GONE); funktioniert nicht immer in Fragmenten, insbesondere wenn Sie Ihre Ansichten in einem viewHolder deklariert haben, der zu einer eigenen Klasse gehört und Sie lediglich vom Viewholder aus referenzieren.
RileyManda

0

Für Kotlin habe ich eine Erweiterungsmethode

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

Dann können Sie im Code Folgendes tun

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

Der Fehler ist behoben und bietet die Flexibilität für jeden Sichtbarkeitsstatus sowie die Aufnahme einer Liste der zu verarbeitenden Ansichten. Es gibt viele Fälle, in denen ich mehr als eine Ansicht gleichzeitig bearbeiten muss, wie in der letzten Beispielzeile gezeigt.


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

0

Zum com.google.android.material.floatingactionbutton.FloatingActionButton

Sichtweite

Verwenden Sie die Methoden zum Ein- und Ausblenden, um die Sichtbarkeit eines FloatingActionButton zu animieren. Die Show-Animation vergrößert das Widget und blendet es ein, während die Hide-Animation das Widget verkleinert und ausblendet.

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

Zur android.support.design.widget.FloatingActionButton Verwendung setVisibility()Methode


0

Für mich haben die oben genannten Methoden nicht funktioniert, daher habe ich eine Erweiterungsfunktion erstellt, damit sie funktioniert.

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

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

Jetzt wie anrufen

binding.fabAdded.showView()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.