浮动操作按钮未完全显示在片段内

Cha*_*dru 47 android android-fragments floating-action-button androiddesignsupport android-coordinatorlayout

我在片段中使用FAB按钮和RecyclerView.此Fragment是TabViewPager的一个实例.我遇到了FAB按钮的问题.我已将RecyclerView和fab按钮放在FrameLayout内,其中FAB按钮位于右下方.现在我遇到的问题是FAB按钮不完全可见.它的一半部分是隐藏的,如下面的屏幕截图所示.任何人都可以帮我解决这个问题.提前致谢.

在FrameLayout中使用RecyclerView的FAB

注意: FAB滚动后正确对齐.只有在理想的情况下(滚动完成之前)才会出现问题.

fragment.xml之

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:app="http://schemas.android.com/apk/res-auto"
             android:layout_width="match_parent"
             android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|bottom"
        android:layout_margin="10dp"
        app:backgroundTint="@color/red"
        android:src="@drawable/ic_done"/>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

tabviewpagerlayout.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"
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <android.support.design.widget.AppBarLayout
        android:id="@+id/appBarLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">


        <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/ThemeOverlay.AppCompat.Light"
            app:layout_scrollFlags="scroll|enterAlways" />


        <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/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

Boj*_*ski 17

无论选择哪个选项卡,都必须显示/隐藏FAB,这是不可接受的解决方案.我已尝试过每个布局组合,但将FAB移动到活动布局是唯一有效的解决方案.但是,如果您只需要一个标签中的按钮怎么办?这是现在唯一有效的方法,但我期待更新设计库,因为这个版本太多了.无论如何,底线是FAB必须是CoordinatorLayout的直接后代,所以它不会被折叠工具栏推下......

  • 仅此而已,但嵌套的 CoordinatorLayout 似乎也不起作用。 (3认同)

Gab*_*tti 10

你应该把你的FAB移到里面CoordinatorLayout.像这样的东西:

<android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.AppBarLayout>

        <android.support.v7.widget.Toolbar
            app:layout_scrollFlags="scroll|enterAlways" />

        <android.support.design.widget.TabLayout/>

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_gravity="end|bottom"/>

</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过以下方式在viewPager中添加RecyclerView:

Adapter adapter = new Adapter(getSupportFragmentManager());
adapter.addFragment(new RecyclerViewFragment(), "Tab1");
viewPager.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)

RecyclerViewFragment布局的位置是:

 <android.support.v7.widget.RecyclerView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
Run Code Online (Sandbox Code Playgroud)

  • 是的我同意.但我的要求是在片段中显示FAB. (20认同)
  • 我有一个MainActivity有三个标签(即图像,音乐,视频).对于每个标签,我有不同的片段,如ImagesFragment,MusicFragment,VideoFragment.所以我的要求是在每个片段中显示单独的FAB按钮. (4认同)
  • @Chandru在很多方面.例如,OnCreateView方法中的getActivity().findById(R.id.fab). (4认同)
  • @Chandru你应该使用一个FAB.如果您需要不同的颜色或不同的动作,可以在片段的onCreateView中指定颜色和动作. (2认同)

cgr*_*cgr 6

  1. 我有同样的问题,FloatingActionButton完全不可见,它在底部的屏幕外.当我向下滚动时,它会出现.
  2. 此外,当向下滚动时,标签会被隐藏但我希望它们始终可见,所以我通过删除来修复它 app:layout_scrollFlags="scroll|enterAlways".向JDev致信如何在向下滚动时隐藏标签?
    这也解决了FloatingActionButton问题,它现在可见了.

  • @cgr这解决了fab的问题,但现在工具栏不会滚动. (5认同)

Ada*_*hns 5

我做了Gabriele建议的将FAB移至包含活动的建议。另外,您还需要在onTabSelected中更新FAB的颜色/ clickListener:

public class MainActivity extends AppCompatActivity implements TabLayout.OnTabSelectedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        ...

        setFloatingActionButtonForImagesTab();

    }

    ...

    @Override
    public void onTabSelected(final TabLayout.Tab tab) {
    switch (tab.getPosition()) {
        case 0:
            setFloatingActionButtonForImagesTab();
            break;
        case 1:
            setFloatingActionButtonForMusicTab();
            break;
        case 2:
            setFloatingActionButtonForVideoTab();
            break;
        }
    }

    ...

}
Run Code Online (Sandbox Code Playgroud)

然后在设置功能中只需设置颜色并单击侦听器即可:

private void setFloatingActionButtonForImagesTab() {
    myViewPager.setCurrentItem(0);
    floatingActionButton.setBackgroundTintList(getResources().getColorStateList(R.color.purple));
    floatingActionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(coordinatorLayout, "images", Snackbar.LENGTH_LONG)
                .show();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

记下setCurrentItem上面的呼叫。现在需要执行TabLayout.OnTabSelectedListener