如何减少MainActivity /外包UI代码的大小

时间:2015-02-28 03:19:43

标签: java android

我的大多数应用程序都是仅有一个屏幕的应用程序(由于功能),有时会通过“浮动”弹出窗口进行扩展,这些弹出窗口基本上是相对于主布局添加的RelativeLayouts(包含其他UI元素),保留UI元素主要布局的活动和背景中的“可触摸”。

为了更好地理解,请看草图(纯粹的象征性): enter image description here

如果你也包括弹出窗口中的所有内容,我有大约90个UI元素,一次打开一些自定义View类,比如按钮,滑块......,所有这些都需要运行某些监听器他们,所有这些都必须在启动时重新调整大小[...]

事实上,我写的效率很高(就所使用的字节数而言)代码,如果有一个3行方法返回一个替换4行附加代码的值,我写这个方法只是为了满足我。但是,我完全不明白如何将代码从我的MainActivity外包给其他类。当然,如果要进行计算,这是我放入另一个类而不是仅仅在MainActivity类中创建方法的东西。无论如何,我的MainActivity现在处于 1600行代码,这是用于调试,添加或更改代码的大量文本。我的UI元素的变量声明单独占用100行代码(如果压缩则可能是70行)

这是我为帖子做过的最长的解释,但现在我们回答了我的问题:

你如何/可以将像侦听器这样的代码,像findViewById()这样的UI东西或类似的东西外包给其他类?是否有通用的做法以有效的方式这样做?我不想采用笨拙的解决方案来飙升CPU,所以“平滑”的东西是我正在寻找的东西。

这可能是偏离主题的,但我希望可以在这里被问到。

1 个答案:

答案 0 :(得分:1)

我不确定你的问题是否有特别的答案,因为我认为这是关于经验的,你可以阅读其他项目的源代码。但我没有什么建议可以帮到你:

1。使用可消除样板代码(如findViewById和侦听器)的库。其中一个是Butterknife

7行代码:

View text = findViewById(R.id.text_id);
text.setOnClickListener(
        new View.OnClickListener() {
            @Override public void onClick(View v) {
                //
            }
        }
);

2行代码:

@OnClick(R.id.text_id) public void handleClickOnText() {
    //
}

2. 使用静态辅助类:

4行代码:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(R.string.new_message);
builder.setTitle(R.string.create_calendar_title);
builder.show();

1行代码:

DialogsHelper.newMessage(this);

3。了解MVP。这是关于模块化应用程序架构。粗略地说,它有助于将原始View与逻辑分开。

基本样本:

public static class SomePresenter {

    private SomeView view;

    public SomePresenter(SomeView view) {
        this.view = view;
        view.showProgressLoading();
        loadData();
    }

    private void loadData(){
        //loading data from some server
    }

    private void loadingDataHandler(SomeModel model){
        view.showData(model);
    }
}

public static class SomeView extends View{

    @Inject(R.id.text_progress_title) TextView text;

    public SomeView(Context context) {
        super(context);
        ButterKnife.inject(this);
    }

    public void showData(SomeModel model){
        text.setText(model.dataA + ":" +  model.dataB);
    }

    public void showProgressLoading(){
        text.setText(R.string.progress);
    }
}

public static class SomeModel{
    public final int dataA;
    public final int dataB;
}

您的onCreate活动方法可能如下所示:

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.inject(this);

    new SomePresenter(someView);
}