我想在2个片段中放置一个浮动操作按钮(FAB),其中包含2个动作(两个碎片相同)。问题是我只有一个活动和许多碎片(超过这两个)。这样做的最佳方式是什么?在主XML中创建FAB还是在两个片段中复制它?
答案 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 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(缩小动画),更改图标,然后再次显示(增长动画):
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;
}
}
});
请注意,我调用的每个片段都会公开一个活动应该调用的公共方法。