以编程方式更改部落fab菜单方向

时间:2017-08-24 15:30:19

标签: android kotlin orientation floating-action-button onconfigurationchanged

我正在使用clans fab library创建一个带有一组按钮的菜单。

我的菜单工作为开放式方向设置为" up",如果手机处于移植模式,这样可以正常工作。但是,如果我将其转为横向模式,则会裁剪一半按钮。

我想知道是否可以在onConfigurationChanged方法上以编程方式更改fab菜单打开方向。

这样的事情:

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
    }
}

我似乎无法找到以编程方式更改此方法的方法。有人知道怎么做吗?

1 个答案:

答案 0 :(得分:2)

不幸的是,浮动操作菜单目前仅支持向上和向下打开方向。

  

向上和向下展开菜单的选项

目前还没有以编程方式更改配置方向的选项:它在XML中设置。

添加水平布局按钮的选项需要对库进行重大更改,因为测量和布局例程未设置为处理这种情况。

建议

鉴于菜单水平呈现时标签将从上到下排列,您的用户体验无论如何都会受到负面影响。此外,大量的菜单项在某种程度上首先击败了FAB的design intention

  

浮动操作按钮表示应用程序中的主要操作。浮动操作按钮用于提升操作。

鉴于这一切,我强烈建议您重新考虑您的方法,并限制您添加到FAB菜单的项目数量,以便项目适合两个方向。将不适合的项目移动到选项菜单或移动到位置正确的上下文菜单。

作为旁注,氏族的回购是生命的终结。我不知道谁将接管它,但它目前的状态是一种风险。

处理配置更改

一种情况是,repo不允许基于配置进行编程更改,但有一种解决方法:使用基于配置的片段来实现相同的结果。例如:

RES /布局/ 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>

现在我们创建两个文件,一个用于纵向,一个用于横向:

RES /布局/ 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 (注意:'left'在这种情况下是虚构的。)

<?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>

这两个文件之间的唯一区别是我们根据配置需要进行布局更改。

现在我们添加魔法将它们全部拉到一起。两个文件让Android知道要选择哪个文件。

/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>

有关详细信息,请参阅Supporting Different Screen Sizes