问题是我的活动,工作活动不是抽象的,需要从其他类继承一些属性,但问题是Java不支持多重继承,因此只能有串行链。
这是我的类层次结构。
第一类用于保存片段(只有一个片段)和工具栏,这也是让多个职责具有多个职责(SOLID)的不良做法,但我不知道如何解决这个问题。最好分成SingleFragment和ToolbarActivity,但这会导致我想要解决的同样问题。
public abstract class SingleFragmentToolBarActivity<T extends Fragment> extends AppCompatActivity implements ScrollableToolbarFragment.ToolbarProvider {
protected Toolbar mToolBar;
private float mDisplayDpHeight;
private float mDisplayDpWidth;
protected abstract T createFragment();
protected abstract int getFragmentContainerId();
protected abstract int getLayoutId();
// protected abstract int getActivityTag();
protected abstract int getToolBarId();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutId());
mToolBar = (Toolbar) findViewById(getToolBarId());
mToolBar = setUpToolbar(mToolBar);
// TODO Fix style or theme !! Just temporary solution
mToolBar.setTitleTextColor(getResources().getColor(R.color.white));
setSupportActionBar(mToolBar);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
int fragmentContainerId = getFragmentContainerId();
Fragment fragment = fragmentManager.findFragmentById(fragmentContainerId);
if (fragment==null) {
fragment = createFragment();
fragmentTransaction
.add(fragmentContainerId,fragment)
.commit();
}
}
这不是完整的类声明,只是最重要的部分。(设置内容布局)
如果不考虑多重责任,这个班级看起来很正常。
第二课负责实施NavigationDrawer,在我的情况下,我在这里使用MaterialDrawer库。这是一个很棒的库,作者使用 InversionOfControl 将导航抽屉添加到运行时的任何活动中。但这对我的情况没有帮助。
public abstract class NavigationDrawerActivity<T extends Fragment> extends SingleFragmentToolBarActivity<T> {
private float mDisplayDpWidth;
private float mDisplayDpHeight;
private Drawer.Result mNavigationDrawer;
private AccountHeader.Result mAccountHeader;
private double mDrawerWidthFactor = 0.9;
private double mDrawerHeaderHeightFactor = 0.3;
private IProfile<ProfileDrawerItem> mProfile;
ProfileSettingDrawerItem settingDrawerItem;
public Drawer.Result getNavigationDrawer() {
return this.mNavigationDrawer;
}
private AccountHeader.Result geAccountHeader() {
return this.mAccountHeader;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setUpNavigationDrawer(savedInstanceState);
}
private void setUpNavigationDrawer(Bundle savedInstanceState) {
getDisplayMetrics();
mAccountHeader = new AccountHeader()
.withActivity(this)
//.....
Drawer buildDrawer = new Drawer(this)
.withActivity(this);
.......
}
就我个人来说,它看起来很糟糕,这个类派生自 SingleFragmentToolBarActivity 。当我必须继承NavigationDrawerActivity
时,我需要像这样宣布我的班级
public class TestActivity extends NavigationDrawerActivity<ScrollableTestFragment> {
我知道这行代码意味着什么。但是如果另一个开发人员会查看这段代码他会感到困惑,为什么他需要用Fragment类来概括NavigationDrawerActivity
?
我试图在这里应用几种模式,但没有什么能真正起作用。
装饰器 - 装饰活动可能很难包装所有活动方法,只要Activity是一种神对象。并且将所有方法委托给内部存储的(作为类成员)包装的活动可能是痛苦的,并且根本不是好的选择。
策略 - 使用接口作为类成员将无济于事,因为所有这些功能(单个framgent,导航抽屉...)紧密耦合到Activity基类,在我看来它不适合这种情况。