Android 浮动操作按钮分为两部分

Android 浮动操作按钮分为两部分,android,android-fragments,floating-action-button,Android,Android Fragments,Floating Action Button,我想在2个片段中放置一个带有2个操作(两个片段相同)的浮动操作按钮(FAB)。问题是我只有一个活动和许多片段(多于这两个)。这样做的最佳方式是什么?在主XML中创建FAB还是在两个片段中复制它 我目前正在开发一个有类似问题的应用程序,下面是我所做的 我从Android Studio导航抽屉活动模板开始(创建新活动并为导航抽屉选择一个)。它在活动的主要内容布局上创建了一个工厂。在这个布局中,我有一个容器,可以在其中交换片段。当我不想让晶圆厂出现时,我会打电话给该活动,然后当我想要它回来时 这要求您

我想在2个片段中放置一个带有2个操作(两个片段相同)的浮动操作按钮(FAB)。问题是我只有一个活动和许多片段(多于这两个)。这样做的最佳方式是什么?在主XML中创建FAB还是在两个片段中复制它

我目前正在开发一个有类似问题的应用程序,下面是我所做的

我从Android Studio导航抽屉活动模板开始(创建新活动并为导航抽屉选择一个)。它在活动的主要内容布局上创建了一个工厂。在这个布局中,我有一个容器,可以在其中交换片段。当我不想让晶圆厂出现时,我会打电话给该活动,然后当我想要它回来时

这要求您知道当前可见的片段,因此在设置片段事务时应提供标记:

getFragmentManager()
    .beginTransaction()
    .replace(R.id.fragment_container, EditTaskFragment.newInstance(true), FRAGMENT_EDIT)
    .addToBackStack(null)
    .commit();
其中,
FRAGMENT\u EDIT
定义为:

private static final String FRAGMENT_EDIT = "edit";
提交事务时,可以调用FAB
show
hide
方法。请注意,这可能还需要您收听“后退”按钮按下事件:

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        if (getFragmentManager().getBackStackEntryCount() > 0){
            EditTaskFragment editFragment = (EditTaskFragment)getFragmentManager().findFragmentByTag(FRAGMENT_EDIT);
            if (editFragment != null && editFragment.isVisible()) {
                // coming back from edit, reset fab to add icon
                setFabIcon(R.drawable.ic_add_24dp);
            }
            getFragmentManager().popBackStack();
        } else if(null == mTaskFragment || !mTaskFragment.cancelRefreshData()) {
            super.onBackPressed();
        }
    }
}
setFabIcon
用于隐藏FAB(收缩动画),更改图标,然后再次显示(生长动画):

在活动的
onCreate
方法中,我为FAB设置了一个单击侦听器,并检查我应该将调用传递给哪个片段:

fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        Fragment currentFragment = getFragmentManager().findFragmentById(R.id.fragment_container);
        String tag = currentFragment.getTag();
        switch (tag) {
            case FRAGMENT_TASKS:
                Snackbar.make(view, "Task creation is...under construction", Snackbar.LENGTH_LONG).show();
                break;
            case FRAGMENT_TURNS:
                ((TurnFragment) currentFragment).takeTurn(view);
                break;
            case FRAGMENT_EDIT:
                ((EditTaskFragment) currentFragment).saveTask();
                break;
            default:
                Log.e(TAG, "Unhandled FAB fragment tag " + tag);
                Snackbar.make(view, "Not sure what to do...my bad", Snackbar.LENGTH_SHORT).show();
                break;
        }
    }
});

请注意,我调用的每个片段都公开了活动预期调用的公共方法。

我以不同的方式使其工作:在方法onCreateView上的每个片段中,我放置了一个代码,根据片段将FAB的可见性设置为GONE或VISIBLE。getMainActivity().mButton_adicionar.setVisibility(View.VISIBLE);这似乎更简单。
fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        Fragment currentFragment = getFragmentManager().findFragmentById(R.id.fragment_container);
        String tag = currentFragment.getTag();
        switch (tag) {
            case FRAGMENT_TASKS:
                Snackbar.make(view, "Task creation is...under construction", Snackbar.LENGTH_LONG).show();
                break;
            case FRAGMENT_TURNS:
                ((TurnFragment) currentFragment).takeTurn(view);
                break;
            case FRAGMENT_EDIT:
                ((EditTaskFragment) currentFragment).saveTask();
                break;
            default:
                Log.e(TAG, "Unhandled FAB fragment tag " + tag);
                Snackbar.make(view, "Not sure what to do...my bad", Snackbar.LENGTH_SHORT).show();
                break;
        }
    }
});