2017-08-03 1 views
1

J'ai une application Android, où une action sera effectuée chaque fois qu'un utilisateur clique sur une image (dont il existe plusieurs). Je voudrais mettre en place un auditeur collectivement pour chacune de ces images, disons que nous avons 6. Plutôt que de direXamarin Android: boucle tous les contrôles dans une activité

myImg0.Click += new MyImgClick; 
myImg1.Click += new MyImgClick; 

J'espérais un moyen d'exécuter une boucle foreach pour définir les écouteurs d'événements de clic rapidement, quelque chose comme

foreach(img i in Application) 
{ 
    i.Click += new MyImgClick; 
} 

alors je pourrais utiliser le gestionnaire d'événements, en utilisant le paramètre « expéditeur » me permettrait d'accéder à l'image individuelle qui a été cliqué.

J'ai essayé de lire sur les classes Activity et Bundle, mais je n'ai rien trouvé de valable à ce jour. Cela ne semble pas être une approche courante, car la plupart des recherches viennent de renvoyer une solution pour "définir des écouteurs d'événements".

Répondre

1

Vous pouvez parcourir votre vue Hiérarchie et obtenir tous les ImageViews que vous voulez avec une méthode récursive simple comme ceci:

private IEnumerable<T> GetViewsByType<T>(ViewGroup root) where T : View 
{ 
    var children = root.ChildCount; 
    var views = new List<T>(); 
    for (var i = 0; i < children; i++) 
    { 
     var child = root.GetChildAt(i); 
     if (child is T myChild) 
      views.Add(myChild); 
     else if (child is ViewGroup viewGroup) 
      views.AddRange(GetViewsByType<T>(viewGroup)); 
    } 
    return views; 
} 

Tout type de ViewViewGroup fonctionnera comme entrée ici, donc LinearLayout, RelativeLayout etc.

Si vous ne donnez pas votre mise en page de racine et ID vous pouvez toujours obtenir la racine avec:

var root = Window.DecorView.FindViewById<ViewGroup>(Android.Resource.Id.Content); 

Ensuite, vous pouvez exécuter la méthode sur cette racine avec et obtenir tous les ImageView s avec:

var imageViews = GetViewsByType<ImageView>(root); 

Je l'ai testé cela sur cette mise en page et il a trouvé tous les ImageView s très bien:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
     <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"/> 
     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"/> 
     </LinearLayout> 
    </LinearLayout> 
    </LinearLayout> 
    <RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
    </RelativeLayout> 
    <FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
    </FrameLayout> 
</LinearLayout> 

Que ce soit la façon optimale de le faire, j'en doute fort. Peut-être que vous devriez penser un peu à l'aide d'un RecyclerView, GridView ou une autre vue qui utilise et Adapter pour être plus efficace en mémoire. Ce peut être une meilleure solution pour vous.