我可以将嵌套的 FloatingActionButton 锚定到视口吗?
Can I anchor nested FloatingActionButton to the viewport?
我有一个嵌套如下的布局(我使用伪代码并为简洁起见跳过了一些标签)
Activity布局:
CoOrdinatorLayout
- AppBarLayout
- FragmentOne
- FragmentTwo
片段二布局使用AppBarLayout.ScrollingViewBehavior但包含FAB:
CoOrdinatorLayout
- FloatingActionButton
- TabLayout
所以运行时层次结构看起来像
CoOrdinatorLayout (Activity)
- AppBarLayout
- LinearLayout (FragmentOne)
- CoOrdinatorLayout (FragmentTwo)
- FloatingActionButton
- TabLayout
FAB 应该锚定在视口(物理屏幕)的右下角,但(由于行为)而是在 viewpager(每个页面上包含列表)的右下角。
这意味着 FAB 仅在布局滚动到末尾时可见(并且应用栏布局折叠)
有什么方法可以让 FAB 像这样嵌套时锚定到视口吗?将它移动到 activity 不是一个好的选择
编辑 - 已经过了几天所以我添加了我在下面使用的解决方案,但是如果有人可以建议清洁工,工作 XML-based 解决方案我将更改已接受的答案,因为这就是我所追求的
我使用的解决方案是在 Fragment 中以编程方式创建 FAB(因此 Fragment 仍然是正确负责实现其侦听器等的那个),然后将其附加到 Activity 的 CoOrdinator 布局(我发现在 activity 上使用 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);
}
}
需要注意的一件事是,我使用了这种 inflation 方法,因为在 View.inflate(...)
的结果上设置点击侦听器似乎不起作用
我有一个嵌套如下的布局(我使用伪代码并为简洁起见跳过了一些标签)
Activity布局:
CoOrdinatorLayout
- AppBarLayout
- FragmentOne
- FragmentTwo
片段二布局使用AppBarLayout.ScrollingViewBehavior但包含FAB:
CoOrdinatorLayout
- FloatingActionButton
- TabLayout
所以运行时层次结构看起来像
CoOrdinatorLayout (Activity)
- AppBarLayout
- LinearLayout (FragmentOne)
- CoOrdinatorLayout (FragmentTwo)
- FloatingActionButton
- TabLayout
FAB 应该锚定在视口(物理屏幕)的右下角,但(由于行为)而是在 viewpager(每个页面上包含列表)的右下角。 这意味着 FAB 仅在布局滚动到末尾时可见(并且应用栏布局折叠)
有什么方法可以让 FAB 像这样嵌套时锚定到视口吗?将它移动到 activity 不是一个好的选择
编辑 - 已经过了几天所以我添加了我在下面使用的解决方案,但是如果有人可以建议清洁工,工作 XML-based 解决方案我将更改已接受的答案,因为这就是我所追求的
我使用的解决方案是在 Fragment 中以编程方式创建 FAB(因此 Fragment 仍然是正确负责实现其侦听器等的那个),然后将其附加到 Activity 的 CoOrdinator 布局(我发现在 activity 上使用 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);
}
}
需要注意的一件事是,我使用了这种 inflation 方法,因为在 View.inflate(...)
的结果上设置点击侦听器似乎不起作用