0 votos

Hola buenos dias, tengo un problema que no sé por qué pasa esto, y no sé cómo solucionarlo.
Tengo el menú horizontal con 5 pestañas/Fragment, en cada uno de estos 5 fragment tengo puesto un <TextView>, si pulso en cualquieras de estas pestañas/frangent, el funcionamiento es correcto, te muestra cada uno de sus fragment.
 
Pero si ahora pongo unos botones, por ejemplo, en el fragment 3, y pulso en el fragment 4, no me muestra el 4, si no que me muestra el fragment 5
 
Ahora he dejado estos 5 fragment, pero cuando tengo 10 fragment, y pulso en el fragment 4, me muestra el fragmente 9 o el 10
Este es el código con el que estoy probando ahora, tengo puesto un <ScrollView> porque la pantalla contiene más elementos. 
 
Fragmente 1, 2, 3, 4, y 5: 

     <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:app="http://schemas.android.com/apk/res-auto"
         xmlns:tools="http://schemas.android.com/tools"
         android:id="@+id/fragmenMenu1"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:clickable="false"
         android:focusable="true"
	   android:background="@color/Blanco"
         android:fillViewport="true"
         tools:context=".Menu3">
     
                 <TextView
                     android:id="@+id/textViewMenu1"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:gravity="center"
                     android:text="Menu 1"
                     android:textSize="40sp" />
     </ScrollView>

Ahora cambio el código del Fragment 3, por unos botones:

     <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:app="http://schemas.android.com/apk/res-auto"
         xmlns:tools="http://schemas.android.com/tools"
         android:id="@+id/fragmenMenu1"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:clickable="false"
         android:focusable="true"
	   android:background="@color/Blanco"
         android:fillViewport="true"
         tools:context=".Menu3">
             
                 <LinearLayout
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content">
             
                     <LinearLayout
                         android:id="@+id/linearL1"
                         android:layout_width="match_parent"
                         android:layout_height="match_parent"
                         android:layout_margin="8dp"
                         android:gravity="center"
                         android:orientation="horizontal">
             
                         <com.google.android.material.button.MaterialButton
                             android:id="@+id/button1"
                             style="@style/Boton_difuminado_4"
                             android:layout_width="wrap_content"
                             android:layout_height="wrap_content"
                             android:layout_marginStart="8dp"
                             android:layout_marginEnd="8dp"
                             android:paddingStart="15dp"
                             android:paddingEnd="15dp"
                             android:text="Boton Prueba 1"
                             android:textAllCaps="false"
                             android:textColor="@android:color/white"
                             app:backgroundTint="@null"
                             app:backgroundTintMode="add" />
             
                         <com.google.android.material.button.MaterialButton
                             android:id="@+id/button2"
                             android:layout_width="wrap_content"
                             android:layout_height="wrap_content"
                             android:layout_marginStart="8dp"
                             android:layout_marginEnd="8dp"
                             android:backgroundTint="@color/Gris_1"
                             android:paddingStart="15dp"
                             android:paddingEnd="15dp"
                             android:text="Boton Prueba 2"
                             android:textAllCaps="false"
                             android:textColor="#ff0000"
                             android:textStyle="bold|italic"
                             app:backgroundTint="@null"
                             app:backgroundTintMode="add" />
             
                     </LinearLayout>
                 </LinearLayout>
     </ScrollView>

Como comento, el funcionamiento del menú ya no es correcto, si la primera vez que abro la aplicación, pulso en el fragment 4, me muestra el menú 5 (o el ultimo que tenga), si a partir de esta pulsación, pulso cualquier otro fragmente, el funcionamiento ya es bueno.
 
O sea, que las primeras veces que abro la aplicación, si pulso cualquier fragmente que este por delante del fragmente 3, muestra todos los fragmente bien, pero a partir del fragment 4, ya no los muestra bien.
 
Porque tiene este comportamiento, y como se puede solucionar.
 
Un saldo.

por en Android

2 Respuestas

0 votos

Hola, por si no se entiende bien dejo unas imagenes para ver el funcionamiento cuando tiene texto, que es correcto, y cuando hay unos botones, el menu no trabaja bien.

Trabajando bien

Trabajando mal.

 

por
0 votos
En el código de las vistas que has puesto no veo nada raro.

Se me ocurre que puedas tener que revisar el pageradapter.
por

Este proyecto lo utilizo para hacer pruebas, y la verdad que no se donde mas mirar, he desactivado todos los fragment, para deja dejar solo que se ve en esas capturas, y no funciona cuando le pongo unos botones, a uno de los fragment,

Pues bien, he creado otro proyecto solo con lo mismo que tengo aquí, no debe de afectar para nada los fragment que tengo desactivados, pues bien, en el otro proyecto que he creado con lo mismo, ahí si funciona, no lo entiendo.

Este es el ViewPagerAdapter

private final ArrayList<Fragment> arrayList = new ArrayList<>();

public ViewPagerAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
    super(fragmentManager, lifecycle);
}

public void addFragment(Fragment fragment) {
    arrayList.add(fragment);
}

@Override
public int getItemCount() {
    return arrayList.size();
}


@NonNull
@Override
public Fragment createFragment(int position) {
    return arrayList.get(position);
}

 

Tampoco veo nada raro.

Si te pasa en un proyecto y no en otro con lo mismo, se me ocurre que pueda ser por el gráfico de navegación (res/navigation/nav_graph.xml)

En la carpeta “res” no tengo ninguna con el nombre “navigation”, he buscado dentro de la carpeta del proyecto por si está en otro sitio el archivo “nav_graph.xml”, y tampoco aparece.

Te cuento los cambios que he realizado, por si tú le ves lógica, pero después de esto ha funcionado, de momento, tengo que probar algo más, veras… he comparado los dos proyectos y he realizado estos cambios… en el proyecto que esta fallando, tenia en el archivo build.gradle este código:

buildscript {
    repositories {
        google()
        mavenCentral()
        maven { url "https://jitpack.io" }  
        jcenter()  
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:7.1.0'
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()   
        maven { url "https://jitpack.io" }  
        jcenter()  
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Y en el proyecto que funcionaba, lo tendía puesto en el archivo settings.gradle 

Así que ahora tengo puesto esta configuración en settings.gradle 

pluginManagement {
    repositories {
        maven { url "https://jitpack.io" } // para que funcione PhotoView
        gradlePluginPortal()
        google()
        mavenCentral()
        jcenter()  //para que funcione la libreria PhotoView Y PDFView
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven { url "https://jitpack.io" } // para que funcione PhotoView
        google()
        mavenCentral()
        jcenter()  //para que funcione la libreria PhotoView Y PDFView
    }
}

rootProject.name = "Menu_Pruebas"
include ':app'

y en el build.gradle se ha quedado con esta configuración:

plugins {
    id 'com.android.application' version '7.1.0' apply false
    id 'com.android.library' version '7.1.0' apply false
}
task clean(type: Delete) {
    delete rootProject.buildDir
}

Y en el archivo gradle.properties, he puesto algún código más, que no tenía en el proyecto que no funcionaba, y no sé muy bien que misión tienen:

org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
android.useAndroidX=true
android.enableJetifier=true
manifestmerger.enabled=true
android.nonTransitiveRClass=true
este ultimo no lo tenia en el proyecto que fallaba.

 

No me lo puedo creer, te he respondido en el post anterior que ya funcionaba, porque ayer apague el ordenador funcionando con esos cambios que he realizado, pero ahora que he vuelto a probar, ya no funciona, esto es increíble, la verdad que no lo entiendo.

Creo que he encontrado el culpable, bueno ayer pensaba que ya lo tenia solucionado con esos cambios, y hoy ha seguido dando problemas, pero puede que el culpable sea el <ScrollView>, y <androidx.constraintlayout.widget.ConstraintLayout> y no comprendo porque

De los 6 fragment que tengo solo el fragment 3 tengo puesto botones para ir haciendo pruebas con ellos, los he ido eliminando uno por uno y probando, y seguía fallando, al pulsar el fragment 4 me muestra el ultimo fragment que hay en el menú.

Pues si cambio el <ScrollView> o el <androidx.constraintlayout.widget.ConstraintLayout> se soluciona el problema.

Con androidx.constraintlayout.widget.ConstraintLayout el menu funciona mal.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/Blanco"
    android:fillViewport="true"
    tools:context=".Menu_3">

	<Button>
	...
	...
	<Button>
	...
	...
	<Button>
</androidx.constraintlayout.widget.ConstraintLayout>

Con ScrollView el menu funciona mal.

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/Blanco"
    android:fillViewport="true"
    tools:context=".Menu_3">

	<androidx.constraintlayout.widget.ConstraintLayout>
           <Button>
           ...
           ...
           <Button>
     	     ...
	     ...
	     <Button>
	</androidx.constraintlayout.widget.ConstraintLayout>
<ScrollView>

Con LinearLayout el menu funciona bien.

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/Blanco"
    android:fillViewport="true"
    tools:context=".Menu_3">

	<Button>
	...
	...
	<Button>
	...
	...
	<Button>
<LinearLayout>

Como puede ser esto, no me explico que no se puedan utilizar ScrollView y ConstraintLayout.

 

Pues sí es un buen error, tampoco me lo había encontrado nunca, alguno parecido pero este que comentas no. Todo sea que tengas que encapsular el Scrollview dentro de un LinearLayout que ocupe todo el ancho y largo del interior de la pestaña para hacer la "trampa" de evitar el problema (aunque personalmente me parece guarrear código).

Conociendo este problema, otra cosa que podrías probar es utilizar TableLayout dentro de Scrollview.

También se me ocurre que pueda ser un problema de caché, en el Android Studio podrías probar con File/Invalidate Caches... (haz una copia de seguridad del código antes).
Si también he puesto el Scrollview dentro de un LinearLayout, y el TableLayout dentro de Scrollview también he probado.

Y lo del Invalidate Caches también lo he pasado varias veces después de hacer pruebas.

Y con ConstraintLayout también pasa.

Y ayer como te comento, pensaba que lo tenia solucionado, porque me estaba funcionando el menú sin problemas, y hoy ha vuelto.

En uno de otro post me aconsejaste utilizar binding en lugar de findViewById, pues los he cambiado todos, por si tiene algo que ver, y mal funcionamiento del menú sigue.
El binding no creo que te solucione este error, solo es para referenciar los elementos de las vistas de la manera moderna.

Cuando se dan esta clase de errores que huelen a ficheros autogenerados mal, o se invalida cache, o se borran los directorios autogenerados a mano e incluso casi es mejor crear otro proyecto nuevo y copiar el código, para que se regenere todo de nuevas.

También he creado un nuevo proyecto, y en este nuevo solo le he puesto un LinearLayout con dos botones, y funciona bien, 

Pero cuando le pongo el ScrollView y el ConstraintLayout, vuelve a fallar.

LinearLayout
     ScrollView
           androidx.constraintlayout.widget.ConstraintLayout
		button
           androidx.constraintlayout.widget.ConstraintLayout
     ScrollView
LinearLayout

Ya no sé qué pensar, si es que hay alguna dependencia que, de problemas, o me falte alguna, te pongo como tengo ese apartado por si hay algo que falte, que supongo que no, pero es que ya no sé por dónde viene el problema.

plugins {
    id 'com.android.application'
}

android {
    compileSdkVersion 31

    defaultConfig {
        applicationId "com.example.menu_pruebas"
        minSdkVersion 25
        targetSdkVersion 31
        versionCode 1
        versionName "2.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
    }

    buildFeatures { viewBinding true }

}

dependencies {

    implementation fileTree(dir: "libs", includes: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    implementation 'androidx.annotation:annotation:1.3.0'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'

    implementation "com.google.android.material:material:1.6.0-alpha02"  

    implementation 'pub.devrel:easypermissions:3.0.0'

    implementation 'com.github.chrisbanes:PhotoView:2.3.0'

    implementation 'com.squareup.picasso:picasso:2.71828'

    implementation 'com.github.GrenderG:Toasty:1.5.0'

    implementation 'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1'

    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

}

afterEvaluate {
    generateReleaseBuildConfig.enabled = false
    generateDebugBuildConfig.enabled = false
    generateReleaseResValues.enabled = false
    generateDebugResValues.enabled = false
}

 

Pudiera ser que alguna versión en concreto sea incompatible con otra, si acaso ya por descartar, quitaría todas las dependencias no necesarias y haría un proyecto limpio completamente, porque si no da el problema de ese modo, entonces ya podrías copiar las versiones dependencias al nuevo ya con el resto.