0 votos

Hola, ahora me he encontrado con un problema que no sé porque me está pasando esto, he creado un proyecto para hacer pruebas, con solo un Activity con un botón que muestra un Fragment.
En este Fragmen muestro un Exposed Drop-Down Menu, que una vez que he visto que funciona bien, este código lo paso a otro proyecto.
 
Pues bien, este segundo proyecto tiene un menú horizontal con 7 pestañas, os describo el comportamiento que tiene el menu…. en la pestaña 4 he puesto el Drop-Down, pero cuando inicio por primera vez la aplicación, y pulso en la pestaña 5, me muestra el contenido de la pestaña 7 (la última).

Si quito el código del Drop-Down y pongo un simple TextView, todos los menús funcionan bien.

Este es el código:

Fragment.java

String[] items =  {"Material","Design","Components","Android","5.0 Lollipop"};

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

	View rootView  = inflater.inflate( R.layout.f_esta, container, false );


	AutoCompleteTextView autoCompleteTxt = rootView.findViewById(R.id.auto_complete_txt);
      ArrayAdapter<String> adapterItems = new ArrayAdapter<String>(getActivity(),R.layout.items_list,items);
      autoCompleteTxt.setAdapter(adapterItems);

retrum rootView;

}

f_esta.xml

<androidx.coordinatorlayout.widget.CoordinatorLayout 
    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:clickable="false">

    <com.google.android.material.textfield.TextInputLayout
        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:hint="@string/nombres"
        app:boxBackgroundColor="@color/Snow">

        <AutoCompleteTextView
            android:id="@+id/auto_complete_txt"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="none" />
    </com.google.android.material.textfield.TextInputLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

items_list.xml

<TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:layout_margin="5dp"
        android:ellipsize="end"
        android:maxLines="1"
        android:layout_centerHorizontal="true"
        android:textSize="20sp"
        android:fontFamily="@font/arno"
        app:fontFamily="@font/arno"
        android:textStyle="bold|italic"
        app:drawableLeftCompat="@drawable/icon_estacion_5"
        android:background="@drawable/esquinas_redondas_3"
        android:textAppearance="?attr/textAppearanceSubtitle1">

</TextView>

La aplicación no se detiene ni muestra ningún mensaje de error, y en alguna ocasión cuando he cambiado el código, y la aplicación se ha detenido, en el Logcat ha mostrado este error:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.AutoCompleteTextView.setAdapter(android.widget.ListAdapter)' on a null object reference

Pero ahora mismo con el código que he puesto, no muestra ningun mensaje de error, pero tiene ese comportamiento
Porque en el otro proyecto funciona bien, y al pasar el código aquí, ya no funciona bien el menú ?
 
Agradecería vuestra ayuda.

por en Android

1 Respuesta

+1 voto
Mejor respuesta
Parece que no te está encontrando algún recurso, en tu código no veo nada raro ¿En qué línea te da el error? Se me ocurre que en el Activity que engloba al Fragment, en el "setContentView" exista el recurso que estás llamando.
por
seleccionada por

He cambiado algunos nombres que tenia puesto en ventanas de alerta dentro de las opciones del menú Overflow, que no creo esto no que tenga que influir, también he desactivado algunas opciones que tenía en Styles como transiciones y animaciones, y parece que de momento funciona, no me digas porque, ya que esto que he desactivado, lo tengo en otros proyectos con pruebas que he realizado y funcionan.
Lo que si he visto es que ha cambiado el fondo del menú de Opciones, o mas bien los márgenes, superior/inferior:

 

Y no se como poner el mismo color del fondo, o igual con un color diferente, sabes porque ahora se muestra esos márgenes de un color diferente ?

Como te digo parece que funciona, salvo eso que he notado del color del fondo, pero por dejar bien el código a que te refieres con lo de asegurar que los ids necesarios estén siempre estén disponibles ?

Lo del color del fondo es jugar con los estilos hasta conseguir el deseado, en principio te debería de funcionar cambiando en los estilos del menú con:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ...
    <item name="android:itemBackground">@color/mi_color</item>
    ...
</style>

Por cierto, para evitar que ocurra el error con los ids, es mejor y más sencillo utilizar binding (en vez de findById). Tienes más información y ejemplos en: https://developer.android.com/topic/libraries/view-binding

Encontré el problema por el que se muestran esas líneas blancas, yo tenía creado un estilo para ese menú de la siguiente forma, que por lo que había visto parecía que era el correcto, pero parece que no:

<style name="AppTheme.FondoMenu" parent="android:Widget.Holo.Light.ListPopupWindow">

ahora lo he cambiado por el que has puesto, y han desaparecido esas lineas, 

<style name="AppTheme.FondoMenu" parent="Theme.AppCompat.Light.DarkActionBar">

Lo que comentas sobre utilizar Binding en lugar de findById, no me queda muy claro, por lo que he visto es mejor como tu dices el utilizar binding, intentare buscar ejemplos para ver su funcionamiento, y poder enterarme mejor, porque lo que encuentro esta en ingles y las traducciones no son muy buenas, así que agradeceria un ejemplo para ver como aplicarlo, pero que no sea para kotlin que parece que este codigo esta creado para kolint ya que los ejemplos que veo estan en kotlin

 

 

Bueno Ramon, el tema del Binding creo que ya lo tengo un poco controlado, me estaba liando con darle el nombre de java, y era del xml.
En la página de Android se puede cambiar el idioma al Español y sale explicado de una manera bastante sencilla.

Como bien comentas, la gracia de binding lo que hace es tomar el id del xml y crea un objeto de java variables cuyos nombres son los ids puestos en el xml.

Me alegro que ya te funcionara todo :)