2012-06-13 5 views
0

Je fais une application simple pour m'aider à apprendre quelques fondamentaux de codage. L'utilisateur clique sur un ImageButton et deux choses se produisent:Changer la position de ImageButton et le contenu en même temps dans onClick

  1. Les Button image change à une image aléatoire. Le Button se déplace vers un emplacement aléatoire sur l'écran.

J'ai compris comment faire ces deux choses dans l'isolement, mais quand je mets les deux ensemble dans un onClick cependant, une seule travaillerai à la fois.

Le code onClick:

ImageButton button = (ImageButton) findViewById(R.id.my_button); 
    button.setOnClickListener(new OnClickListener() { 
     public void onClick (View v) { 

      // change button image 
      int imgNo = (int) (Math.random() * 9) + 1; // 9 images in the folder, start at index 1 
      int imgID = getResources().getIdentifier("chef" + imgNo, "drawable", getPackageName()); 
      v.setBackgroundResource(imgID); 

      // move button to a random location 
      LinearLayout button_container = (LinearLayout) findViewById(R.id.my_window); 
      int x = (int) (Math.random() * (button_container.getWidth() - v.getWidth())); // might need to work out how to find if phone is landscape or portrait; 
      int y = (int) (Math.random() * (button_container.getHeight() - v.getHeight())); 
      v.layout(x, y, x + v.getWidth(), y + v.getHeight()); 

      Toast.makeText(WhackachefActivity.this, "X: " + x + " Y: " + y + " Width: " + v.getWidth() + " Height: " + v.getHeight() + " Image: " + imgNo, Toast.LENGTH_LONG).show();   
     } 
    }); 

Le Toast est juste là pour prouver toutes les variables fonctionnent correctement. Si le changement d'emplacement ou le code de changement d'image est mis en commentaire, l'autre fonctionne correctement. Si l'image est définie de manière aléatoire sur l'image en cours (c'est-à-dire sans changement d'image), alors l'emplacement aléatoire fonctionne, mais autrement, il est défini à l'emplacement par défaut dans le XML.

Pour référence, le principal XML est:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
android:id="@+id/my_window" > 

<ImageButton 
    android:id="@+id/my_button" 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:layout_gravity="center" 
    android:contentDescription="@string/description" 
    /> 

En tant que suivi, deux questions connexes:

  1. Comment puis-je faire fonctionner de code onClick une fois lorsque la L'application est d'abord chargée?
  2. Comment puis-je faire la taille ImageButton lui-même automatiquement (c.-à adapter la taille des images aléatoires, qui sont légèrement différents, sans les étirer)

Répondre

1

D'accord, la question principale, je n'ai pas une réponse désinvolte - Je ne sais pas pourquoi cela fonctionnerait si vous supprimez simplement la ressource d'arrière-plan, mais peut-être que si vous changez la ressource d'arrière-plan après la mise en page? Ça vaut le coup, mais ça n'explique pas vraiment pourquoi ça arriverait.

Maintenant, les questions "points bonus", je peux répondre:

1: Il suffit d'appeler imageButton.performClick() dans votre onCreate() (après avoir affecté votre OnClickListener, bien sûr).

2: Set de LayoutParams-wrap_content, wrap_content le ImageButton, puis appelez imageButton.requestLayout();. Il devrait ensuite être dimensionné pour s'adapter au contenu.

+0

Merci kcoppock - PerformClick() et requestLayout() résoudre mes problèmes secondaires. J'ai vérifié et le principal problème de ne pas pouvoir faire les deux à la fois est toujours là. En termes de commande, je voudrais d'abord changer l'image pour pouvoir la positionner en utilisant ses nouvelles dimensions, mais je l'ai testé dans les deux sens et l'ordre ne semble pas avoir d'importance en termes de problème principal. – Alex

1

J'ai trouvé une solution qui fonctionne - en utilisant le remplissage de LinearLayout pour déplacer le bouton au lieu d'utiliser .layout. Le principal code d'activité (avec quelques modifications mineures le long du chemin) ressemble maintenant à ceci:

final ImageButton button = (ImageButton) findViewById(R.id.my_button); 
final LinearLayout button_container = (LinearLayout) findViewById(R.id.my_window); 

button.setOnClickListener(new OnClickListener() { 
    public void onClick (View v) { 

     // change button image 
     int imgNo = (int) (Math.random() * 9) + 1; // 9 images in the folder, start at index 1 
     int imgID = getResources().getIdentifier("chef" + imgNo, "drawable", getPackageName()); 
     button.setBackgroundResource(imgID); 
     button.requestLayout(); // size to fit content 

     // move button to a random location 
     int x = (int) (Math.random() * (button_container.getWidth() - button.getWidth())); 
     int y = (int) (Math.random() * (button_container.getHeight() - button.getHeight())); 
     button_container.setPadding(x, y, 0, 0); 
    } 
}); 
button.performClick(); // run once at the start to set image and position randomly 
Questions connexes