Friday, August 7, 2015

Android View visibility DSL

Часто встречаю такой код при разработке для Android:
view.setVisibility(condition ? View.VISIBLE : View.GONE);
Использование такой конструкции приводит к тому, что это тернарное выражение дублируется в setVisibility практически каждого view, который нужно показать или спрятать. В качестве альтернативы можно использовать простенький DSL, который позволит писать что то вроде:
gone(view,
     otherView,
     moreView)
    .orVisibleIf(condition);
Плюсов сразу несколько -это позволяет управлять видимостью нескольких view одновременно, убирает многократное повторение условного выражения и в целом короче и лучше читается. А вот "определение" этого DSL:
final class ViewVisibilityTools {
    public interface OrVisible {
        void orVisibleIf(boolean condition);
    }

    public OrVisible gone(final View...views) {
        return new OrVisible() {
            @Override public void orVisibleIf(final boolean condition) {
                setVisible(views, condition, View.GONE);
            }
        };
    }

    public OrVisible invisible(final View...views) {
        return new OrVisible() {
            @Override public void orVisibleIf(final boolean condition) {
                setVisible(views, condition, View.INVISIBLE);
            }
        };
    }

    private void setVisible(final View views[],
                            final boolean condition,
                            final int alternative) {
        final int visibility;

        if (condition) visibility = View.VISIBLE;
        else visibility = alternative;

        for (final View v: views) {
            v.setVisibility(visibility);
        }
    }
}
Нужно только статически импортировать методы gone и invisible там где они нужны.

No comments:

Post a Comment