两个片段中的浮动操作按钮

时间:2015-11-11 19:30:22

标签: android android-fragments floating-action-button

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

1 个答案:

答案 0 :(得分:3)

我目前正在处理一个有类似问题的应用,这就是我所做的。

我开始使用Android Studio导航抽屉活动模板(创建新活动并选择导航抽屉的活动)。它在Activity的主要内容布局之上创建了一个FAB。在那个布局中,我有一个容器,我可以在里面和外面交换碎片。当我不想显示FAB时,我会在活动中调用FloatingActionButton.hide(...),然后在我想要它时调用FloatingActionButton.show()

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

getFragmentManager()
    .beginTransaction()
    .replace(R.id.fragment_container, EditTaskFragment.newInstance(true), FRAGMENT_EDIT)
    .addToBackStack(null)
    .commit();

FRAGMENT_EDIT定义为:

private static final String FRAGMENT_EDIT = "edit";

提交交易时,您可以调用FAB showhide方法。请注意,这可能还需要您按下后退按钮按下事件:

@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(缩小动画),更改图标,然后再次显示(增长动画):

private void setFabIcon(final int resId) {
    fab.hide(new FloatingActionButton.OnVisibilityChangedListener() {
        @Override
        public void onHidden(FloatingActionButton fab) {
            fab.setImageResource(resId);
            fab.show();
        }
    });
}

在Activity的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;
        }
    }
});

请注意,我调用的每个片段都会公开一个活动应该调用的公共方法。