Android P visibilityawareimagebutton.setVisibility можно вызывать только из той же группы библиотек

145

Я пытаюсь использовать новый Android P FloatingActionButton, который является частью, com.google.android.material.floatingactionbutton.FloatingActionButtonи получаю следующее предупреждение:

VisibilityAwareImageButton.setVisibility можно вызывать только из той же группы библиотек (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
    }
}

введите описание изображения здесь

Я пробовал искать, и единственный результат поиска касается реакции на изменения видимости пользовательского интерфейса:

Реагируйте на изменения видимости пользовательского интерфейса

Я попытался выяснить, есть ли VISIBLEв этом com.google.android.materialпакете значение типа int и единственное, что я нашел com.google.android.material.floatingactionbutton.FloatingActionButton.VISIBLE, но предупреждение все еще остается.

Build.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
}

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

редактировать:

Я должен отметить, что я использую Android Studio версии 3.2 canary 14. Похоже, в этой версии были сообщения об ошибках, и я подозреваю, что это одна из них.

редактировать 2:

Проблема все еще существует с Android Studio версии 3.2 canary 15, но я нашел обходной путь, используя show()иhide()

override fun onCreate(savedInstanceState: Bundle?) {
    demoFab = findViewById(R.id.demoFab)
    demoFab.show()    // this works and doesn't have the warning
}
Кайл Фалконер
источник
Правильный пакет - android.support.design.widget.FloatingActionButton
Панкадж Кумар
С Android P и Jetpack Fab был перемещен в этот пакет, это тот, который я пытаюсь использовать. developer.android.com/reference/com/google/android/material/…
Кайл Фальконер
@KyleFalconer Canary 15 теперь доступен, проверьте, может ли обновление решить вашу проблему :)
Леви Морейра
2
@PankajKumar Ага, все еще не работает, но я нашел другое обходное решение (добавил "изменить 2" к моему вопросу).
Кайл Фалконер
5
Эта проблема описывает ошибку: issueetracker.google.com/issues/115924750 К сожалению, нет решения или исправления банкомата, поэтому, вероятно, каждый, кто затронут, должен пометить его.
ChristophK

Ответы:

270

Использование метода 1

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

и метод 2

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

Обновить:

Способ 3:

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

Метод 4:

demoFab.visibility = View.GONE
demoFab.visibility = View.INVISIBLE
demoFab.visibility = View.VISIBLE
Ахила Мадари
источник
2
Это тоже добавляет красивую анимацию!
ror
1
привет, есть ли УДАЛЕННЫЕ и НЕВИДИМЫЕ методы?
Сергей
Использование .show () может удалить предупреждение, но есть одна проблема: если FAB установил, например, в XML, android: alpha = "0.5" для прозрачности, прозрачность не работает. Как исправить эту проблему? Вместо этого я предпочитаю использовать demoFab.visibility = View.VISIBLE, если .show () не может работать на android: alpha
Фишер
методы show и hide идеально подходят для стандартных кнопок с плавающим действием.
firespacexyz
9

Кажется, отлично работает, просто чтобы передать его в представление.

(mFloatingActionButton as View).visibility = INVISIBLE

Конечно, вам нужно помнить, что видимость может повлиять на другие компоненты, поэтому вам, вероятно, следует использовать show()и hide()в то же время убедиться, что другие компоненты уведомлены об изменении.

Андреас
источник
5
как насчет того, чтобы установить для видимости значение GONE вместо INVISIBLE?
Чарли
1
@charlie Какую разницу между GONE и INVISIBLE вы ожидаете от плавающей кнопки действия? Фабрика обычно находится над остальной частью макета, поэтому не занимает места.
Невероятное
6

Использование:

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

Типичный пример:

Скрытие и отображение кнопок, когда пользователь печатает или фокусируется на ресурсе EditText:

проверьте, набирает ли пользователь или сфокусирован:

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


    });

Способы скрытия и отображения кнопок:

private void hideButtons() {

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

private void showBts() {

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

И в вашем xml установите кнопки невидимыми по умолчанию, чтобы они отображались / отображались только тогда, когда пользователь находится в фокусе или вводит:

android:visibility="invisible"

Лучшая практика:

 android:visibility="Gone"

Отсутствие видимости означает, что ваше представление не занимает места на вашем макете, в то время как «невидимый» будет занимать ненужное место на вашем макете.

В этом примере: Мои представления находятся в ViewHolder, а iam ссылается на кнопки из фрагмента с помощью recylerview

РайлиМанда
источник
3

Это тоже работает:

findViewById(R.id.fab).setVisibility(View.GONE);
vcdo
источник
Да, это так. В моем примере я использовал фрагмент: setVisibility (View.GONE); не всегда работает по фрагментам, особенно если вы объявили свои представления в viewHolder, который находится в отдельном собственном классе, и вы просто ссылаетесь на Viewholder.
RileyManda
1

Для меня вышеуказанные методы не работали, поэтому я создал функцию расширения, чтобы она работала.

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

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

теперь звони как

binding.fabAdded.showView()
Викас Кумар
источник
0

Для Kotlin у меня есть метод расширения

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

Затем в коде вы можете сделать следующее

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

Ошибка исчезнет, ​​и это дает гибкость для любого состояния видимости вместе с получением списка представлений для обработки. Часто мне нужно обрабатывать более одного представления за раз, как показано в последней строке примера.

Кевин
источник
0
if(data){
            fragmentPendingApprovalDetailsBinding.fabPendingList.show();
        }else {
            fragmentPendingApprovalDetailsBinding.fabPendingList.hide();
        }
Soumen Das
источник
0

За com.google.android.material.floatingactionbutton.FloatingActionButton

Видимость

Используйте методы show и hide, чтобы оживить видимость FloatingActionButton. Анимация показа увеличивает виджет и исчезает, в то время как анимация скрытия сжимает виджет и затемняет его.

Источник: https://material.io/develop/android/components/floating-action-button/

Для android.support.design.widget.FloatingActionButton использования setVisibility()Метод

танни танна
источник