Próbuję użyć nowego FloatingActionButton systemu Android P, który jest częścią com.google.android.material.floatingactionbutton.FloatingActionButton
i otrzymuję to ostrzeżenie:
VisibilityAwareImageButton.setVisibility można wywołać tylko z tej samej grupy bibliotek (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
}
}
Próbowałem wyszukiwać i jedyny wynik wyszukiwania dotyczy reagowania na zmiany widoczności interfejsu użytkownika:
Reaguj na zmiany widoczności interfejsu użytkownika
Próbowałem zbadać, jak mogę sprawdzić, czy VISIBLE
w tym com.google.android.material
pakiecie jest wartość int i jedyna, którą znalazłem, to com.google.android.material.floatingactionbutton.FloatingActionButton.VISIBLE
, ale ostrzeżenie nadal pozostaje.
Build.gradle na najwyższym poziomie
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 na poziomie projektu
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'
}
edytować:
Powinienem zauważyć, że używam Android Studio w wersji 3.2 canary 14. Wygląda na to, że zgłoszono kilka błędów w tej wersji i podejrzewam, że to jeden z nich.
edycja 2:
Problem nadal występuje w Android Studio w wersji 3.2 canary 15, ale udało mi się go obejść przy użyciu show()
ihide()
override fun onCreate(savedInstanceState: Bundle?) {
demoFab = findViewById(R.id.demoFab)
demoFab.show() // this works and doesn't have the warning
}
źródło
Odpowiedzi:
Korzystanie z metody 1
i metoda 2
aktualizacja:
Metoda 3:
Metoda 4:
źródło
Wydaje się, że działa dobrze, tylko po to, by rzucić to na widok.
(mFloatingActionButton as View).visibility = INVISIBLE
Oczywiście musisz pamiętać, że widoczność może wpływać na inne komponenty, więc prawdopodobnie powinieneś użyć
show()
ihide()
jednocześnie upewnić się, że inne komponenty zostaną powiadomione o zmianie.źródło
Posługiwać się:
Typowy przykład to:
Ukrywanie i wyświetlanie przycisków, gdy użytkownik pisze lub ma fokus na zasobie EditText:
sprawdź, czy użytkownik pisze lub ma fokus:
Ukryj i pokaż metody przycisków:
A w swoim xml ustaw przyciski jako niewidoczne domyślnie, aby wyświetlały / pokazywały się tylko wtedy, gdy użytkownik ma fokus lub pisze:
Najlepsze praktyki:
Brak widoczności oznacza, że widok nie zajmuje miejsca w układzie, a „niewidoczny” zajmuje niepotrzebne miejsce w układzie
W tym przykładzie: Moje widoki znajdują się w ViewHolder i iam odwołują się do przycisków z fragmentu z recylerview
źródło
Działa to również:
źródło
Dla Kotlina mam metodę rozszerzenia
Następnie w kodzie możesz wykonać następujące czynności
Błąd zniknie, a to zapewnia elastyczność dla każdego stanu widoczności wraz z listą widoków do obsługi. Często zdarza się, że potrzebuję obsługiwać więcej niż jeden widok naraz, jak pokazano w ostatnim wierszu przykładu.
źródło
źródło
Dla
com.google.android.material.floatingactionbutton.FloatingActionButton
Widoczność
Użyj metod show i hide, aby animować widoczność FloatingActionButton. Animacja pokazu powiększa widżet i zanika, podczas gdy animacja ukrywania zmniejsza widżet i zanika.
Źródło: https://material.io/develop/android/components/floating-action-button/
Do
android.support.design.widget.FloatingActionButton
użytkusetVisibility()
Metodaźródło
U mnie powyższe metody nie działały, więc stworzyłem funkcję rozszerzenia, aby działała.
teraz zadzwoń jak
źródło