Görünürlük yalnızca aynı kütüphane grubundan çağrılabilir


143

Bir parçası olan yeni Android P FloatingActionButton kullanmaya çalışıyorum com.google.android.material.floatingactionbutton.FloatingActionButtonve bu uyarıyı alıyorum:

VisibilityAwareImageButton.setVisibility yalnızca aynı kütüphane grubundan çağrılabilir (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
    }
}

resim açıklamasını buraya girin

Arama yapmayı denedim ve tek arama sonucu kullanıcı arayüzü görünürlüğü değişikliklerine yanıt vermekle ilgili:

Kullanıcı arayüzü görünürlük değişikliklerine yanıt verme

Ben VISIBLEbu com.google.android.materialpakette bir int değeri olup olmadığını görmek için nasıl keşfetmek için çalıştı ve bulduğum tek com.google.android.material.floatingactionbutton.FloatingActionButton.VISIBLE, ama uyarı hala kalır.

Üst düzey yapı.gradle

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
}

Proje düzeyinde 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'
}

Düzenle:

Android Studio 3.2 3.2 kanarya 14 kullanıyorum. Bu sürüm için bildirilen bazı hatalar var gibi görünüyor ve bu onlardan biri olduğundan şüpheleniyorum.

düzenleme 2:

Android Studio sürüm 3.2 kanarya 15 ile ilgili sorun hala var, ancak şunu kullanarak bir çözüm buldum show()vehide()

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

Doğru paket android.support.design.widget.FloatingActionButton
Pankaj Kumar

Android P ve Jetpack ile Fab bu pakete taşındı, kullanmaya çalıştığım şey bu. developer.android.com/reference/com/google/android/material/…
Kyle Falconer

@KyleFalconer Canary 15 kullanıma sunuldu, güncellemenin sorununuzu çözüp çözemeyeceğini kontrol edin :)
Levi Moreira

2
@PankajKumar Yup, hala kırık, ama bunun için başka bir geçici çözüm buldum (soruma "düzenleme 2" eklendi).
Kyle Falconer

5
Bu sorun hatayı açıklıyor : issuetracker.google.com/issues/115924750 Ne yazık ki, bir çözüm veya düzeltme atm yoktur, bu nedenle etkilenen her biri buna yıldız eklemelidir.
ChristophK

Yanıtlar:


266

Yöntem 1'i kullanma

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

ve Yöntem 2

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

Güncelleme:

Yöntem 3:

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

Yöntem 4:

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

2
Bu da güzel animasyonlar ekliyor!
ror

1
merhaba, GONE ve INVISIBLE yöntemleri var mı?
Siarhei

.Show () yöntemini kullanmak uyarıyı kaldırabilir, ancak bir sorun vardır: FAB, örneğin XML'de ayarladıysa, saydamlık için android: alpha = "0.5", saydamlık çalışmaz. Bu sorun nasıl çözülür? Bunun yerine, eğer .show () android üzerinde çalışamazsa demoFab.visibility = View.VISIBLE kullanmayı tercih edeceğim: alpha
Fisher

gösterme ve gizleme yöntemleri standart kayan eylem düğmeleri için mükemmeldir.
FirestormXYZ

9

Sadece bir görünüme atmak için iyi çalışıyor gibi görünüyor.

(mFloatingActionButton as View).visibility = INVISIBLE

Elbette görünürlüğün diğer bileşenleri etkileyebileceğini hatırlamanız gerekir, bu nedenle muhtemelen diğer bileşenlerin değişiklikten haberdar edildiğinden emin olmak için show()ve kullanmalısınız hide().


5
Görünürlüğü GÖRÜNMEZ yerine GONE olarak ayarlamak istersem ne olur?
charlie

1
@charlie Kayan eylem düğmesinden GONE ve INVISIBLE arasında ne fark bekliyorsunuz? Bir fab genellikle yerleşimin geri kalanının üzerinde yer alır, bu nedenle yer kaplamaz.
İnanılmaz

6

kullanın:

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

Tipik bir örnek:

Kullanıcı bir EditText kaynağına yazarken veya odaklandığında düğmeleri gizleme ve gösterme:

kullanıcının yazıp yazmadığını veya odaklanıp odaklanmadığını kontrol edin:

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


    });

Düğme yöntemlerini Gizle ve Göster:

private void hideButtons() {

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

private void showBts() {

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

Ve xml'nizde, düğmeleri yalnızca bir kullanıcı odaklandığında veya yazarken görüntüleyecek / gösterecek şekilde varsayılan olarak görünmez olarak ayarlayın:

android:visibility="invisible"

En iyi pratik:

 android:visibility="Gone"

Görünürlüğün kullanılması, görünümünüzün düzeninizde yer kaplamadığı anlamına gelirken "görünmez" düzeninizde gereksiz yer kaplar

Bu örnekte: Görünümlerim bir ViewHolder'da ve iam bir parçadan gelen düğmelere referans veren bir recylerview ile


3

Bu ayrıca işe yarar:

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

Evet öyle. Örneğimde bir parça kullanıyordum: setVisibility (View.GONE); özellikle görünümlerinizi kendi başına ayrı bir sınıfta olan viewHolder'da bildirdiğinizde ve yalnızca Viewholder'dan referans aldığınızda her zaman parçalarda çalışmaz.
RileyManda

0

Kotlin için bir uzatma yöntemim var

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

Sonra kodda aşağıdakileri yapabilirsiniz

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

Hata giderilecek ve bu, işlemek için bir görünüm listesi almanın yanı sıra herhangi bir görünürlük durumu için esneklik sağlar. Son örnek satırında gösterildiği gibi, aynı anda birden fazla görünümü ele almam gereken birçok kez vardır.


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

0

İçin com.google.android.material.floatingactionbutton.FloatingActionButton

görünürlük

Bir FloatingActionButtonunun görünürlüğünü canlandırmak için show and hide yöntemlerini kullanın. Gösteri animasyonu widget'ı büyütür ve soluklaştırırken, gizleme animasyonu widget'ı daraltır ve soldurur.

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

İçin android.support.design.widget.FloatingActionButton kullanımı setVisibility()Yöntem


0

Benim için yukarıdaki yöntemler işe yaramadı, bu yüzden çalışması için bir uzantı işlevi oluşturdu.

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

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

şimdi gibi ara

binding.fabAdded.showView()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.