Android Bottom Sticky Button向上移动滚动

时间:2016-06-25 09:22:28

标签: android android-relativelayout

我有一个标签式布局,我想在底部有一个粘滞按钮。 当布局大于屏幕尺寸时,我可以向上滚动,工具栏也向上滚动以将标签对齐为最顶层元素。当我滚动时,按钮也会向上滚动,因为我在底部有一个填充物,以便在启动时保持状态。

Before Scroll After Scroll (Button moves up)

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>

5 个答案:

答案 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);
}

就是这样。现在,我们的始终浮动按钮位于屏幕底部。