Android P visibilityawareimagebutton.setVisibility hanya dapat dipanggil dari grup perpustakaan yang sama


143

Saya mencoba menggunakan Android P FloatingActionButton baru yang merupakan bagian dari com.google.android.material.floatingactionbutton.FloatingActionButtondan saya mendapatkan peringatan ini:

VisibilityAwareImageButton.setVisibility hanya dapat dipanggil dari grup perpustakaan yang sama (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
    }
}

masukkan deskripsi gambar di sini

Saya sudah mencoba mencari dan satu-satunya hasil pencarian dalam menanggapi perubahan visibilitas UI:

Tanggapi perubahan visibilitas UI

Saya mencoba mengeksplorasi bagaimana saya bisa melihat apakah ada VISIBLEnilai int dalam com.google.android.materialpaket itu dan satu-satunya yang saya temukan adalah com.google.android.material.floatingactionbutton.FloatingActionButton.VISIBLE, tetapi peringatan itu tetap ada.

Build.gradle tingkat atas

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 tingkat proyek

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

edit:

Saya harus mencatat bahwa saya menggunakan Android Studio versi 3.2 kenari 14. Sepertinya ada beberapa bug yang dilaporkan untuk versi ini, dan saya menduga ini adalah salah satunya.

edit 2:

Masalah masih ada dengan Android Studio versi 3.2 kenari 15, tapi saya menemukan solusi untuk itu menggunakan show()danhide()

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

Paket yang benar adalah android.support.design.widget.FloatingActionButton
Pankaj Kumar

Dengan Android P dan Jetpack, Fab dipindahkan ke paket ini, itulah yang saya coba gunakan. developer.android.com/reference/com/google/android/material/…
Kyle Falconer

@KyleFalconer Canary 15 sekarang tersedia, periksa apakah pembaruan dapat memperbaiki masalah Anda :)
Levi Moreira

2
@PankajKumar Yup, masih rusak, tapi saya menemukan solusi lain untuk itu (menambahkan "edit 2" ke pertanyaan saya).
Kyle Falconer

5
Masalah ini menjelaskan bug: issuetracker.google.com/issues/115924750 Sayangnya, tidak ada solusi atau perbaikan atm, jadi mungkin setiap orang yang terpengaruh harus membintanginya.
ChristophK

Jawaban:


266

Menggunakan Metode 1

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

dan Metode 2

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

memperbarui:

Metode 3:

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

Metode 4:

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

2
Ini juga menambah animasi yang indah!
ror

1
hai, apakah ada metode PERGI dan TIDAK TERLIHAT?
Siarhei

Menggunakan .show () dapat menghapus peringatan, tetapi ada satu masalah: jika FAB telah mengatur, misalnya dalam XML, android: alpha = "0,5" untuk transparansi, transparansi tidak berfungsi saat itu. Bagaimana cara mengatasi masalah ini? Alih-alih, saya akan lebih suka menggunakan demoFab.visibility = View.VISIBLE jika .show () tidak dapat bekerja di android: alpha
Fisher

metode menunjukkan dan menyembunyikan sangat cocok untuk tombol aksi mengambang standar.
FirestormXYZ

9

Tampaknya berfungsi dengan baik hanya untuk melemparkannya ke tampilan.

(mFloatingActionButton as View).visibility = INVISIBLE

Tentu saja Anda harus ingat bahwa visibilitas dapat mempengaruhi komponen lain, jadi Anda mungkin harus menggunakan show()dan hide()pada saat yang sama untuk memastikan komponen lain diberitahu tentang perubahan tersebut.


5
bagaimana kalau saya ingin mengatur visibilitas ke GONE alih-alih tidak terlihat?
charlie

1
@charlie Apa perbedaan yang Anda harapkan antara GONE dan INVISIBLE dari tombol aksi mengambang? Sebuah fab biasanya terletak di atas sisa tata letak sehingga tidak memakan tempat.
luar biasa

6

Menggunakan:

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

Contoh tipikal adalah:

Menyembunyikan dan menampilkan tombol saat pengguna mengetik atau memiliki fokus pada sumber daya EditText:

periksa apakah pengguna mengetik atau memiliki fokus:

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


    });

Sembunyikan dan Tampilkan metode tombol:

private void hideButtons() {

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

private void showBts() {

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

Dan di xml Anda, atur tombol menjadi tak terlihat secara default sehingga hanya ditampilkan / ditampilkan ketika pengguna memiliki fokus atau mengetik:

android:visibility="invisible"

Praktek terbaik:

 android:visibility="Gone"

Menggunakan visibilitas yang hilang berarti tampilan Anda tidak memakan ruang pada tata letak Anda sementara "tidak terlihat" akan mengambil ruang yang tidak perlu pada tata letak Anda

Dalam contoh ini: My Views berada dalam ViewHolder dan saya merujuk tombol-tombol dari sebuah fragmen dengan recylerview


3

Ini juga berfungsi:

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

Ya. Saya menggunakan sebuah fragmen dalam contoh saya: setVisibility (View.GONE); tidak selalu berfungsi dalam fragmen terutama ketika Anda telah mendeklarasikan pandangan Anda dalam viewHolder yang memiliki kelas tersendiri dan Anda hanya merujuk dari Pemirsa.
RileyManda

0

Untuk Kotlin saya punya metode ekstensi

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

Kemudian di dalam kode Anda dapat melakukan hal berikut

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

Kesalahan akan hilang dan ini memberikan fleksibilitas untuk setiap kondisi visibilitas bersama dengan mengambil daftar pandangan untuk ditangani. Ada banyak kali saya perlu menangani lebih dari satu tampilan pada suatu waktu seperti yang ditunjukkan pada baris contoh terakhir.


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

0

Untuk com.google.android.material.floatingactionbutton.FloatingActionButton

Visibilitas

Gunakan metode pertunjukan dan sembunyikan untuk menghidupkan visibilitas FloatingActionButton. Animasi acara menumbuhkan widget dan memudar, sedangkan animasi hide menyusut widget dan memudar.

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

Untuk android.support.design.widget.FloatingActionButton menggunakan setVisibility()Metode


0

Bagi saya metode di atas tidak berfungsi jadi saya membuat fungsi ekstensi untuk membuatnya berfungsi.

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

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

sekarang panggilan seperti

binding.fabAdded.showView()
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.