1

minIndex に基づいて、異なるビューの可視性を設定しています。簡単な方法でリファクタリングできると思います。

switch (minIndex) {
    case 0:
        viewOne.setVisibility(View.VISIBLE);
        break;
    case 1:
        viewTwo.setVisibility(View.VISIBLE);
        break;
    case 2:
        viewThree.setVisibility(View.VISIBLE);
        break;
    case 3:
        viewFour.setVisibility(View.VISIBLE);
        break;
    case 4:
        viewFive.setVisibility(View.VISIBLE);
        break;
    case 5:
        viewSix.setVisibility(View.VISIBLE);
        break;
}

このコードをより読みやすいコードにリファクタリングするにはどうすればよいですか?

4

2 に答える 2

5

数値が実際のビューとうまく一致する場合は、配列を使用できます。

View[] views = new View[] {viewOne, viewTwo, viewThree, ...};
...
views[minIndex].setVisibility(View.VISIBLE);
于 2013-10-26T05:15:45.840 に答える
1

このサイトのコードは匿名化されていると思います。@Sotirios Delimanolisの回答を提案するつもりでしたが、実際にはやりすぎと少なすぎの両方を行っていると思います。

コントローラーをビューにバインドしすぎており、ビューを相互にバインドしすぎています。なぜそれらすべてを同じswitchステートメントに含める必要があるのですか?

別のビューを追加する場合、どの程度変更する必要がありますか?

代わりに、各ビューにPropertyChangeListenerを保持するオブジェクトに を登録させる必要がありますminindex。ちなみに悪名です。オブジェクトが変更されると、すべてのリスナーminindexに a を送信する必要があります。PropertyChangeEvent各ビューのリスナーは、イベントがそのビューを表示することを望んでいるかどうかを確認する必要があります。その場合、ビューはそれ自体を目覚めさせる必要があります。

class ViewController {
    private PropertyChangeSupport pcs = new PropertyChangeSupport();

    // delegate methods to add and remove listeners to pcs variable.

    private int viewIndex; // Changed for documentation.  Use String instead?

    public void setViewIndex(final int viewIndex) {
        int oldIndex = this.viewIndex;
        this.viewIndex = viewIndex; 
        pcs.firePropertyChange("viewIndex", oldIndex, this.viewIndex);
    }
}

class ViewOne {
    private ViewController vc;
    private final Integer myIndex = 1;

    // Constructor

    public void init() {
        // Never add this or an inner class to another object in a constructor.
        vc.addPropertyChangeListener("viewIndex",
            new PropertyChangeListener() {
                public propertyChange(final PropertyChangeEvent evt) {
                    if (myIndex.equals(evt.getNewValue()) {
                         setVisibility(View.VISIBLE);
                    }
                }
            });
    }
}

コンストラクターに関する警告は、コンストラクター内の別のオブジェクトにthisまたは内部クラスを公開するthisと、その外部オブジェクトthisが完全に構築される前に相互作用する可能性があることです。コンストラクターで PCL をビルドできます。別の方法を使用して、コントローラーに追加します。

于 2013-10-26T05:48:45.880 に答える