我可以将嵌套的FloatingActionButton锚定到视口吗?

时间:2016-09-21 09:36:33

标签: android android-coordinatorlayout floating-action-button

我有一个嵌套如下的布局(我使用的是伪代码并为了简洁而跳过一些标签)

活动布局

CoOrdinatorLayout
    - AppBarLayout
         - FragmentOne
    - FragmentTwo

片段两个布局使用AppBarLayout.ScrollingViewBehavior但包含FAB:

CoOrdinatorLayout
    - FloatingActionButton
    - TabLayout

所以运行时层次结构看起来像

CoOrdinatorLayout (Activity)
    - AppBarLayout
         - LinearLayout (FragmentOne)
    - CoOrdinatorLayout (FragmentTwo)
         - FloatingActionButton
         - TabLayout

FAB应该锚定在视口的右下角(物理屏幕),而是(因为行为)位于viewpager的右下角(其中包含每个页面上的列表)。 这意味着FAB仅在布局滚动到最后时才可见(并且应用栏布局已折叠)

有没有什么方法可以让FAB锚定到视口,而它是这样嵌套的?将其移至活动不是一个好的选择

编辑 - 已经有几天了,所以我添加了我在下面使用的解决方案,但是如果有人可以提出更清晰,基于XML的工作方式解决方案我将改变接受的答案,因为这就是我所追求的

1 个答案:

答案 0 :(得分:0)

我使用的解决方案是Programmaticaly在Fragment中创建FAB(因此片段仍然是正确负责实现它的听众等)然后将它附加到Activity的CoOrdinator布局(我发现在活动中使用getter接口,因为它似乎是使用getActivity().findViewById(...)的更清晰的替代方法)

public class MyActivity extends implements MyCallbacks {
    ...
}

public interface MyCallbacks {
    CoordinatorLayout getCoordinatorLayoutRoot();
}

public class MyFragment extends Fragment {

    ...

    private void setupNewFab() {
        final CoordinatorLayout rootCoordinator = ((MyCallbacks) getActivity())
            .getCoordinatorLayoutRoot();
        final LayoutInflater inflater = (LayoutInflater) getActivity()
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        final FloatingActionButton fab = (FloatingActionButton) inflater.inflate(
            R.layout.my_fab_definition, rootCoordinator, false);
        fab.setOnClickListener(v -> myAction());
        rootCoordinator.addView(fab);
    }

}

有一点需要注意的是,我使用了这种通胀方法,因为在View.inflate(...)的结果上设置点击监听器似乎无法正常工作