programacion - manual android studio avanzado
La visibilidad de la visibilidad de Android P se puede realizar solo desde el mismo grupo de bibliotecas (6)
Estoy intentando usar el nuevo Android P FloatingActionButton que forma parte de
com.google.android.material.floatingactionbutton.FloatingActionButton
y recibo esta advertencia:
VisibilityAwareImageButton.setVisibility solo se puede llamar desde el mismo grupo de bibliotecas (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
}
}
He intentado buscar y el único resultado de la búsqueda es en lo que respecta a responder a los cambios de visibilidad de la interfaz de usuario:
https://developer.android.com/training/system-ui/visibility
Intenté explorar cómo podía ver si había un valor
VISIBLE
int en ese paquete
com.google.android.material
, y el único que encontré fue
com.google.android.material.floatingactionbutton.FloatingActionButton.VISIBLE
, pero la advertencia todavia esta.
Build.gradle de nivel superior
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
}
Nivel de proyecto 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''
}
editar:
Debo tener en cuenta que estoy usando Android Studio versión 3.2 canary 14. Parece que ha habido algunos errores reportados para esta versión, y sospecho que es uno de ellos.
edición 2:
El problema aún existe con la versión 3.2 de Android Studio canary 15, pero encontré una solución alternativa utilizando
show()
y
hide()
override fun onCreate(savedInstanceState: Bundle?) {
demoFab = findViewById(R.id.demoFab)
demoFab.show() // this works and doesn''t have the warning
}
Esto también funciona:
findViewById(R.id.fab).setVisibility(View.GONE);
Para Kotlin tengo un método de extensión.
fun viewsVisibility(visibility: Int, vararg views: View) {
for (view in views) { view.visibility = visibility }
}
Luego en el código puedes hacer lo siguiente
viewsVisibility(View.VISIBLE, demoFab)
viewsVisibility(View.GONE, demoFab)
viewsVisibility(View.INVISIBLE, demoFab, addFab, removeFab)
El error desaparecerá y esto proporciona la flexibilidad para cualquier estado de visibilidad junto con tomar una lista de vistas para manejar. Hay muchas veces que necesito manejar más de una vista a la vez como se muestra en la línea de ejemplo final.
Parece que funciona bien solo para verlo.
(mFloatingActionButton as View).visibility = INVISIBLE
Por supuesto, debe recordar que la visibilidad puede afectar a otros componentes, por lo que probablemente debería usar
show()
y
hide()
al mismo tiempo para asegurarse de que se notifique el cambio a otros componentes.
Usando el Método 1
demoFab.show(); // in place of visible
demoFab.hide(); // in place of Invisible suppress the warning/error for me.
y Método 2
@SuppressLint("RestrictedApi") // also suppressed the warning
private void setUp() {
....
}
Utilizar:
myButton.hide();
myClearButton.hide();
Un ejemplo típico sería:
Ocultar y mostrar botones cuando el usuario está escribiendo o se centra en un recurso EditText:
compruebe si el usuario está escribiendo o tiene el foco:
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();
}
}
});
Ocultar y mostrar los métodos de botón:
private void hideButtons() {
mCommentButton.hide();
mClearButton.hide();
}
private void showBts() {
mCommentButton. show();
mClearButton.show();
Y en tu xml, configura los botones como invisibles de manera predeterminada para que solo se muestren / muestren cuando un usuario tiene el foco o está escribiendo:
android:visibility="invisible"
Mejores prácticas:
android:visibility="Gone"
Utilizar la visibilidad desaparecida significa que su vista no ocupa espacio en su diseño, mientras que "invisible" ocupará espacio innecesario en su diseño
En este ejemplo: Mis vistas están en un ViewHolder e iam que hacen referencia a los botones de un fragmento con una recylerview
if(data){
fragmentPendingApprovalDetailsBinding.fabPendingList.show();
}else {
fragmentPendingApprovalDetailsBinding.fabPendingList.hide();
}