1

私の Android プロジェクトでは、onClick()onTouch()およびonItemSelected()イベント (MVC のコントローラー) をリッスンする専用のクラスを用意し、画面にはいくつかのSpinnerオブジェクトがあります。この場合、イベントが発生すると、アルゴリズムは 1)Spinner選択されているものと 2) 選択されているものを認識している必要がありItemます。したがって、以下のように入れ子になったスイッチを持つことになります。

@Override
public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
    switch(parent.getId()) {
    case R.id.spn1:
        switch (position) {
        case 0:
            // code
            break;
        case 1:
            // code
            break;
        case 2:
            // code
            break;
        }
    break;
    case R.id.spn2:
        switch (position) {
        case 0:
            // code
            break;
        case 1:
            // code
            break;
        case 2:
            // code
            break;
        }
    break;
    case R.id.spn3:
        switch (position) {
        case 0:
            // code
            break;
        case 1:
            // code
            break;
        case 2:
            // code
            break;
        }
    break;
    default:
    }
}

以下に投稿されたサンプルは、すでに頭痛の種でした。この大きな混乱を回避する方法が (おそらく OOP を使用して) あるかどうかを知りたいです。

4

3 に答える 3

1

これらのスピナーの位置で何をしたいかによります。スピナーの位置ごとにまったく異なることをしている場合、それ以上最適化することはできません。

この場合にできる最善の方法は、アイテムごとに(または、1つのスピナーがすべての位置で同様のことを行う場合はスピナーごとに)プライベート関数を作成して呼び出すことです。

ネストされたスイッチが悪いとは思わないでください。実行が速く、読みやすく、保守も簡単です。避けるべきことは、各caseブロックにあまりにも多くのコードを入れることです。代わりにプライベート関数を呼び出す必要があります。

于 2012-07-25T13:11:10.867 に答える
1

それぞれに個別Listenerのクラスを作成しますView

public class MyClass extends Activity{

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        /* Necessary View fetching code omitted */
        mySpinner.setOnItemSelectedListener(new MySpinnerOnItemSelectedListener());
    }

    private class MySpinnerOnItemSelectedListener implements OnItemSelectedListener{

        @Override
        public void onItemSelected(AdapterView<?> parent, View v, int position, long id){ 
            /* Here you only have your inner switch statement */
        }
    }
}
于 2012-07-25T11:40:59.053 に答える
1

OnItemSelectedListener各スピナーに別々の を使用できます。

一部のコードを一緒に共有しているため、これが必要ない場合でも、onItemSelectedメソッド内で1つのスイッチを使用して、クリックされたスピナーを特定し、実際のアイテムを実行するスピナーごとに個別のメソッドを呼び出すことを検討しますスイッチ。

ただし、コードを共有しない限り、スピナーごとに異なるリスナーを使用することをお勧めします。これらのリスナーも内部クラスとして作成しますが、クラスが少し肥大化します。

アダプターがすべてのスピナー間で異なる安定した IDidを使用している限り、パラメーターを使用することもできます。ほとんどの場合、これは当てはまらないため、上記の 2 つの可能性に限定されます。

于 2012-07-25T11:45:01.813 に答える