活动双重继承 - 可怕的代码

时间:2015-05-31 16:43:33

标签: java android inheritance android-fragments android-activity

问题是我的活动,工作活动不是抽象的,需要从其他类继承一些属性,但问题是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基类,在我看来它不适合这种情况。

0 个答案:

没有答案