如何在ViewPager中使用Fragments来隐藏和显示FloatingActionButton?

5
我试图只在一个片段中显示我的FloatingActionButton并在其余片段中隐藏。 我尝试了多个答案,但没有任何作用。 我尝试了这个解决方案: 隐藏另一个布局的浮动操作按钮 但它不起作用。 我尝试在两个片段上添加按钮,一个显示FAB,一个隐藏FAB,它可以工作,但一旦我删除按钮,它就无法自动显示。 这是我的代码:

hidden_fragment.xml:

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

</LinearLayout>

shown_fragment.xml:

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

</LinearLayout>

HiddenFragment.java:

public class HiddenFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
        View view = inflater.inflate(R.layout.hidden_fragment, container, false);

        final FloatingActionButton fab = ((MainActivity) getActivity()).getFloatingActionButton();

        if (fab != null) {
            ((MainActivity) getActivity()).hideFloatingActionButton();
        }

        return view;
    }

}

ShownFragment.java:

public class ShownFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
        View view = inflater.inflate(R.layout.hidden_fragment, container, false);

        final FloatingActionButton fab = ((MainActivity) getActivity()).getFloatingActionButton();

        if (fab != null) {
            ((MainActivity) getActivity()).showFloatingActionButton();
        }

        return view;
    }

}
在我的MainActivity.java中,我有这个:
public FloatingActionButton getFloatingActionButton() {
    return fab;
}

public void showFloatingActionButton() {
    fab.show();
}

public void hideFloatingActionButton() {
    fab.hide();
}

目前的方式不起作用。当我启动应用程序时,第一个启动的片段是HiddenFragment。但是当我转到ShownFragment时,FAB不会出现。我尝试了另一种方法,我在每个片段中添加了一个按钮,并将showFloatingActionButton()和hideFloatingActionButton()添加到按钮中,这样就可以正常工作了。有人知道我做错了什么吗?


在更改可见性之前,您必须摆脱锚点。请尝试以下代码: CoordinatorLayout.LayoutParams p = (CoordinatorLayout.LayoutParams) fab.getLayoutParams(); p.setAnchorId(View.NO_ID); fab.setLayoutParams(p); fab.setVisibility(View.GONE); - Rakshit Nawani
当你想隐藏它时,直到将其可见性设置为VISIBLE才会显示。 - Rakshit Nawani
那段代码对你有用吗? - Rakshit Nawani
@RakshitNawani 看起来好像没有。它仍然在做同样的事情。 - Alexiz Hernandez
使用 show()hide() 应该能够正常工作,这对我很有效。您正在使用哪个版本的支持库?此外,您是否在该片段中使用 ViewPager? - Daniel Nugent
显示剩余2条评论
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
12

要在ViewPager中的Fragments中显示/隐藏FloatingActionButton,只需使用ViewPager.OnPageChangeListener并在您想要的位置显示FloatingActionButton,以及在您想要的位置隐藏它。

这将放在Activity中:

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                switch (position) {
                case 0:
                    fab.hide();
                    break;
                case 1:
                    fab.show();
                    break;
                case 3:
                    fab.hide();
                    break;
                default:
                    fab.hide();
                    break;
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

1
成功了!这么明显,我想太多了。非常感谢你的帮助!! :) - Alexiz Hernandez
这个例子仅适用于具有 fab 的一个片段,但是如果我想让所有片段都有一个 fab,则此代码不会显示任何动画 ... 因为开关始终显示 fab,从不隐藏... - Ely Dantas
@Ely 请确保浮动操作按钮(fab)在Activity布局中。只需切换每个使用fab的Fragment的图标/操作即可。有关更多详细信息,请参见此处:http://stackoverflow.com/documentation/android/2979/floatingactionbutton/13346/show-and-hide-floatingactionbutton-on-swipe#t=20160926031742388375 - Daniel Nugent

1

隐藏其他片段中的浮动按钮。这对我的情况有效。

在MainActivity.java中添加:

private ActivityMainBinding binding;

public FloatingActionButton getFloatingActionButton() {
     return binding.fab;
}

SecondFragment中的onCreateView方法:

private FloatingActionButton floatingButton;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     floatingButton = ((MainActivity) getActivity()).getFloatingActionButton();
     floatingButton.hide();
     ...
}

1

它可以像下面这样进行调整,包括在导航期间的 FAB 可见性或任何活动元素。

navController = findNavController(R.id.nav_host_fragment_activity_main)

    with(binding.editNoteFab) {
        setOnClickListener {
            navController.navigate(R.id.action_listNotesFragment_to_addNoteFragment)
        }
    }

    navController.addOnDestinationChangedListener { _, destination, _ ->
        when (destination.id) {
            R.id.listNotesFragment -> showFloatingButton()
            R.id.editNoteFragment -> hideFloatingButton()
            R.id.addNoteFragment -> hideFloatingButton()
            else -> showFloatingButton()
        }
    }
把那个代码块放到MainActivity中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,