Могу ли я назначить OnClickListener () по умолчанию для активности Android? - PullRequest
3 голосов
/ 23 апреля 2011

У меня есть Activity, для которой для каждого виджета в макете я вызываю setOnClickListener (), чтобы назначить мой обработчик OnClick ().В моем обработчике OnClick () я использую оператор switch для выполнения желаемого кода для каждой кнопки на основе идентификатора параметра View.Есть ли способ назначить обработчик по умолчанию для основного представления вместо необходимости выполнять отдельные вызовы назначения слушателя для каждого виджета в представлении?

=======================================================

ОБНОВЛЕНИЕ

Благодаря начальному примеру kcoppock я написал полную реализацию класса, который имеет статический метод, который устанавливает обработчик кликов для всех элементов View в Activity в общий обработчик кликов.Это для тех ситуаций, когда у вас есть простой макет, и вы хотите выполнить всю обработку события в обычном событии прослушивателя щелчков, которое использует оператор switch на основе идентификатора объекта параметра View.Чтобы использовать его из Activity, просто вызовите Misc.setDefaultClickHandler (this, this) .Естественно, ваша активность должна реализовывать интерфейс View.OnclickListener.

package {put your package name here};

import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;

public class Misc {

    public Misc() {
        super();
    }

    // Returns the root view for a given activity.
    public static View getRootView(Activity activity) {
        return activity.findViewById(android.R.id.content).getRootView();
    }

    private static void assignClickHandler(View root, View.OnClickListener theOnClickListener) {

        // Is it a View or a View group?
        if (root instanceof ViewGroup) {

            // It's a ViewGroup, process all it's children.
            ViewGroup vg = (ViewGroup) root;

            for(int i = 0; i < vg.getChildCount(); i++) 
                // Make recursive call.
                assignClickHandler(vg.getChildAt(i), theOnClickListener);
        } 
        else 
        {
            // Child is a View.  Set the desired context for the click handler.
            root.setOnClickListener(theOnClickListener);
        }
    }

    public static void setDefaultClickHandler(Activity activity, View.OnClickListener theOnClickListener) {
        assignClickHandler(getRootView(activity), theOnClickListener);
    }
}

- roschler

1 Ответ

5 голосов
/ 23 апреля 2011

Насколько мне известно, но вы можете просто использовать цикл, что-то вроде этого:

ViewGroup root = findViewById(R.id.my_root_layout);
final Context context = this;
assignClickHandler(root);

public void assignClickHandler(int root) {
    for(int i = 0; i < root.getChildCount(); i++) {
        if(root.getChildAt(i) instanceof ViewGroup) {
            assignClickHandler(root.getChildAt(i));
        }
        else {
            (root.getChildAt(i)).setOnClickListener(context);
        }
    }
}

Обратите внимание, что он также вызывает рекурсивно для любых вложенных макетов внутри. Я не проверял это, поэтому я мог испортить некоторый синтаксис, но эта идея должна работать, если вы просто хотите избежать ручной настройки каждого из них.

...