Cambia la orientación del menu de fab programáticamente

Estoy usando la biblioteca de fab de clanes para crear un menu con un set de botones.

Mi menu es fabuloso como una dirección abierta configurada en "arriba", y esto funciona bastante bien si el teléfono está en modo retrato. Sin embargo, si lo cambio al modo horizontal, la mitad de los botones se recortarán.

Me preguntaba si podría cambiar la orientación abierta del menu fab mediante progtwigción en mi método onConfigurationChanged.

Algo como esto:

override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { // set menu fab orientation to start|left } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ // set menu fab orientation to up } } 

Parece que no puedo encontrar el método para cambiar esto programáticamente. ¿Alguien sabe cómo hacerlo?

Desafortunadamente, el menu de acción flotante actualmente solo admite subidas y bajadas para su dirección abierta.

Opción para expandir el menu hacia arriba y hacia abajo

Actualmente, tampoco hay ninguna opción para cambiar la dirección configurada de forma programática: se establece en el XML.

Agregar la opción para diseñar los botones horizontalmente requeriría cambios significativos en la biblioteca ya que las rutinas de medición y layout no están configuradas para manejar este caso.

Recomendación

Dado que las tags se distribuirán de arriba abajo cuando el menu se presenta de forma horizontal, la experiencia del usuario se verá negativamente afectada de todos modos. Además, una gran cantidad de elementos de menu en cierto modo frustra la intención de layout del FAB en primer lugar.

Un button de acción flotante representa la acción principal en una aplicación. Un button de acción flotante se usa para una acción promocionada.

Dado todo eso, le recomiendo encarecidamente que reconsidere su enfoque y que limite la cantidad de elementos que está agregando al menu FAB para que los artículos quepan en ambas direcciones. Mueva los elementos que no se ajustan al menu de opciones o a un menu contextual contextual bien ubicado.

Como nota al margen, el repository de clanes es el final de la vida. No sé quién se hará cargo, pero su estado actual es un riesgo.

Manejo de cambios de configuration

Uno se encuentra con situaciones en las que un repository no permite cambios programáticos basados ​​en la configuration, pero hay una forma de evitarlo: usar fragments basados ​​en la configuration para lograr el mismo resultado. Por ejemplo:

res / layout / activity_main.xml

 <?xml version="1.0" encoding="utf-8"?> <android.support.design.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" tools:context="com.example.fabmenu.MainActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay"/> </android.support.design.widget.AppBarLayout> <include layout="@layout/content_main"/> <!-- Replace the FAB with a fragment reference --> <include layout="@layout/fragment_fab_menu"/> </android.support.design.widget.CoordinatorLayout> 

Ahora creamos dos files, uno para retrato y otro para paisaje:

res / layout / fragment_fab_portrait.xml

 <?xml version="1.0" encoding="utf-8"?> <com.github.clans.fab.FloatingActionMenu 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" ... app:menu_openDirection="left" > <com.github.clans.fab.FloatingActionButton android:id="@+id/menu_item_horse" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/fab_add" app:fab_colorNormal="@color/colorAccent" app:fab_label="Horse" app:fab_size="mini"/> ... </com.github.clans.fab.FloatingActionMenu> 

res / layout / fragment_fab_landscape.xml (Nota: 'left' es ficticio en este caso).

 <?xml version="1.0" encoding="utf-8"?> <com.github.clans.fab.FloatingActionMenu 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" ... app:menu_openDirection="left" > <com.github.clans.fab.FloatingActionButton android:id="@+id/menu_item_horse" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/fab_add" app:fab_colorNormal="@color/colorAccent" app:fab_label="Horse" app:fab_size="mini"/> ... </com.github.clans.fab.FloatingActionMenu> 

Las únicas diferencias entre estos dos files son los cambios de layout que necesitamos en function de la configuration.

Ahora agregamos la magia para unir todo. Dos files para que Android sepa qué file elegir.

/res/values/layouts.xml

 <?xml version="1.0" encoding="utf-8"?> <resources> <item name="fragment_fab_menu" type="layout">@layout/fragment_fab_portrait</item> </resources> 

/res/values/layouts-land.xml

 <?xml version="1.0" encoding="utf-8"?> <resources> <!-- Here name refers to the id we gave it in activity_main.xml --> <item name="fragment_fab_menu" type="layout">@layout/fragment_fab_landscape</item> </resources> 

Para get más información, vea Cómo admitir diferentes tamaños de pantalla