我有一个标签式布局,我想在底部有一个粘滞按钮。 当布局大于屏幕尺寸时,我可以向上滚动,工具栏也向上滚动以将标签对齐为最顶层元素。当我滚动时,按钮也会向上滚动,因为我在底部有一个填充物,以便在启动时保持状态。
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:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="io.sampleapp.MainActivity">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/appbar_padding_top"
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:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/AppTheme.PopupOverlay">
</android.support.v7.widget.Toolbar>
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
fragment_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="io.sampleapp.MainActivity$PlaceholderFragment">
<android.support.v7.widget.RecyclerView
android:id="@+id/mRecyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/bottomButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="54dp"
android:background="#555555"
android:text="dummy"
android:textColor="#ffffff" />
</RelativeLayout>
答案 0 :(得分:2)
我认为Button应位于CoordinatorLayout
标记之外,尝试从fragment_main.xml
移除按钮并将其添加到activity_main.xml
,如:
<android.support.v4.view.ViewPager
... />
<android.support.design.widget.AppBarLayout
<android.support.design.widget.CoordinatorLayout
...
</android.support.design.widget.CoordinatorLayout>
<Button
android:id="@+id/bottomButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="54dp"
android:background="#555555"
android:text="dummy"
android:textColor="#ffffff" />
</android.support.design.widget.AppBarLayout>
在其他片段中,如果您不需要按钮,则可以使其不可见。
答案 1 :(得分:1)
将您的按钮放在RecyclerView外面。
答案 2 :(得分:1)
我可以说的是,您可能在没有遵循正确的材料设计指南的情况下尝试实现用例。
为什么不使用FAB aka FloatingActionButton?
答案 3 :(得分:1)
我建议,删除按钮的边距底部,并将边距添加到与按钮高度相同的高度回收视图
答案 4 :(得分:0)
我不希望将浮动按钮放在片段支架或回收站的外部,无论视图是什么,如上面的响应所示。但是我想将按钮放在Fragment中,并使用屏幕逻辑对其进行维护。
这就是我可以实现的目标。如果假设我们有一个AppBarLayout
,并且在其中有一个CollapsingToolbarLayout
,并且这些视图都包裹在CoordinatorLayout
内。
我创建了一个名为BaseFragment
的公共功能的setOffsetChanged
:
public void setOffsetChanged(AppBarLayout appBarLayout, int verticalOffset){
//Empty function
}
然后在MainActivity
中,将创建引用的对象添加到AppBarLayout
:
private AppBarLayout appBar;
protected void onCreate(Bundle savedInstanceState){
appBar = findViewById(R.id.appBar);
appBar.addOnOffsetChangedListener(this);
}
实现侦听器AppBarLayout.OnOffsetChangedListener
。
public class MainActivity extends AppCompatActivity
implements AppBarLayout.OnOffsetChangedListener{}
并添加其功能:
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
BaseFragment fragment = (BaseFragment) getSupportFragmentManager().getFragments()
.get(getSupportFragmentManager().getFragments().size() - 1);
fragment.setOffsetChanged(appBarLayout, verticalOffset);
}
好吧,现在我们只需要从片段中具有{floating“按钮的BaseFragment
中添加此功能:
@Override
public void setOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
super.setOffsetChanged(appBarLayout, verticalOffset);
ConstraintLayout.LayoutParams buttonParams = (ConstraintLayout.LayoutParams) buttonHolder.getLayoutParams();
int marginBottomDP = (int) (SCALE * 100 + 0.5f); //100 because that is the space needed to appear besides the collapsed AppBarLayout
buttonParams.bottomMargin = ((verticalOffset * -1) - marginBottomDP) * -1;
buttonHolder.setLayoutParams(buttonParams);
}
就是这样。现在,我们的始终浮动按钮位于屏幕底部。