2013-06-14 2 views
2

J'ai une classe qui aura besoin de ~ 100 boutons. Je sais que je peux le code comme ceci:Manière plus efficace d'initier 100 boutons

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/scroll" 
    android:fillViewport="true" 
    android:scrollbars="none" 
    android:paddingLeft="16dp" 
    android:paddingRight="16dp" 
    android:paddingTop="10dp" 
    android:paddingBottom="65dp" > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:paddingTop="5dp" 
     android:paddingBottom="5dp" 
     android:paddingRight="5dp" 
     android:paddingLeft="5dp" 
     android:background="@drawable/scrollviewborder" 
     android:fillViewport="true" > 

     <Button 
      android:id="@+id/b1" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b2" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b3" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b4" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b5" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b6" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b7" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b8" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b9" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b10" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b11" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b12" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b13" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b14" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b15" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b16" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b17" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b18" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b19" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 

     <Button 
      android:id="@+id/b20" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_gravity="center" 
      android:textSize="18sp" /> 
    </LinearLayout> 
</ScrollView> 

Mais cela ne semble pas les performances très efficace et je sais que si je continue à le faire, il signaleront bientôt un avertissement que j'ai trop de lignes de code. Y a-t-il une manière plus élégante de faire ceci? XML ou en Java fera l'affaire, peu importe le chemin.

EDIT

J'ai provoqué un tollé à avoir 100 boutons dans ma conception. Laissez-moi vous expliquer pourquoi.

Quelqu'un joue-t-il à l'application Android/Apple Candy Crush Saga? Vous savez comment ils ont plus de 400 niveaux à jouer que vous débloquez un à la fois? C'est similaire à ce que je fais, c'est pourquoi j'ai besoin de tant de boutons.

Après cette explication, si je suis toujours en train de faire ce mal, s'il vous plaît laissez-moi savoir que je suis encore un programmeur débutant Android.

+0

Eh bien ... Pourquoi vous avez besoin de tant de boutons? S'ils font tous quelque chose de similaire, ils peuvent être créés et ajoutés en utilisant une boucle. – WouterH

+0

Vous pourriez essayer de définir un seul bouton dans une mise en page et si nécessaire, mais un ListView pourrait être mieux. –

+0

Au lieu de LinearLayout et tant de boutons à l'intérieur, pourquoi ne pas utiliser un ListView à la place? – gunar

Répondre

2

Pour ce faire correctement, utilisez un processus en deux étapes. La première chose à noter est que chacun de vos boutons a un identifiant unique. Il est recommandé de déclarer tous vos identifiants au XML, afin de garantir leur unicité. Donc, la première étape consiste à configurer votre fichier xml ids (vous pouvez ignorer cela si vous ne vous souciez pas de l'ID).

Dans le répertoire res/values, créez le fichier ids.xml, avec le contenu suivant:

<resources> 
    <item type="id" name="b1" /> 
    <item type="id" name="b2" /> 
    <item type="id" name="b3" /> 
    <item type="id" name="b4" /> 
    <item type="id" name="b5" /> 
    <item type="id" name="b6" /> 
    <item type="id" name="b7" /> 
    <item type="id" name="b8" /> 
    <item type="id" name="b9" /> 
    <item type="id" name="b10" /> 
    <item type="id" name="b11" /> 
    <item type="id" name="b12" /> 
    <item type="id" name="b13" /> 
    <item type="id" name="b14" /> 
    <item type="id" name="b15" /> 
    <item type="id" name="b16" /> 
    <item type="id" name="b17" /> 
    <item type="id" name="b18" /> 
    <item type="id" name="b19" /> 
    <item type="id" name="b20" /> 
    <item type="id" name="b21" /> 
    <item type="id" name="b22" /> 
    <item type="id" name="b23" /> 
    <item type="id" name="b24" /> 
    <item type="id" name="b25" /> 
    <item type="id" name="b26" /> 
    <item type="id" name="b27" /> 
    <item type="id" name="b28" /> 
    <item type="id" name="b29" /> 
    <item type="id" name="b30" /> 
    <item type="id" name="b31" /> 
    <item type="id" name="b32" /> 
    <item type="id" name="b33" /> 
    <item type="id" name="b34" /> 
    <item type="id" name="b35" /> 
    <item type="id" name="b36" /> 
    <item type="id" name="b37" /> 
    <item type="id" name="b38" /> 
    <item type="id" name="b39" /> 
    <item type="id" name="b40" /> 
    <item type="id" name="b41" /> 
    <item type="id" name="b42" /> 
    <item type="id" name="b43" /> 
    <item type="id" name="b44" /> 
    <item type="id" name="b45" /> 
    <item type="id" name="b46" /> 
    <item type="id" name="b47" /> 
    <item type="id" name="b48" /> 
    <item type="id" name="b49" /> 
    <item type="id" name="b50" /> 
    <item type="id" name="b51" /> 
    <item type="id" name="b52" /> 
    <item type="id" name="b53" /> 
    <item type="id" name="b54" /> 
    <item type="id" name="b55" /> 
    <item type="id" name="b56" /> 
    <item type="id" name="b57" /> 
    <item type="id" name="b58" /> 
    <item type="id" name="b59" /> 
    <item type="id" name="b60" /> 
    <item type="id" name="b61" /> 
    <item type="id" name="b62" /> 
    <item type="id" name="b63" /> 
    <item type="id" name="b64" /> 
    <item type="id" name="b65" /> 
    <item type="id" name="b66" /> 
    <item type="id" name="b67" /> 
    <item type="id" name="b68" /> 
    <item type="id" name="b69" /> 
    <item type="id" name="b70" /> 
    <item type="id" name="b71" /> 
    <item type="id" name="b72" /> 
    <item type="id" name="b73" /> 
    <item type="id" name="b74" /> 
    <item type="id" name="b75" /> 
    <item type="id" name="b76" /> 
    <item type="id" name="b77" /> 
    <item type="id" name="b78" /> 
    <item type="id" name="b79" /> 
    <item type="id" name="b80" /> 
    <item type="id" name="b81" /> 
    <item type="id" name="b82" /> 
    <item type="id" name="b83" /> 
    <item type="id" name="b84" /> 
    <item type="id" name="b85" /> 
    <item type="id" name="b86" /> 
    <item type="id" name="b87" /> 
    <item type="id" name="b88" /> 
    <item type="id" name="b89" /> 
    <item type="id" name="b90" /> 
    <item type="id" name="b91" /> 
    <item type="id" name="b92" /> 
    <item type="id" name="b93" /> 
    <item type="id" name="b94" /> 
    <item type="id" name="b95" /> 
    <item type="id" name="b96" /> 
    <item type="id" name="b97" /> 
    <item type="id" name="b98" /> 
    <item type="id" name="b99" /> 
    <item type="id" name="b100" /> 
</resources> 

Ensuite, créez vos boutons dans le code:

for (int i = 0; i < 100; i++) 
{ 
    Button button = new Button(this); 
    int _id = getResources().getIdentifier("b" + (i+1), "id", this.getPackageName()); 
    button.setTag(_id); 
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, 0); 
    params.weight = 1; 
    params.gravity = Gravity.CENTER; 
    button.setLayoutParams(params); 
    button.setTextSize(18); 
    myLinearLayout.addView(button);//myLinearLayout is your parent LinearLayout. 
} 
+0

A travaillé parfaitement! C'est ce que j'espérais être une solution alternative. – Matt

+0

@Matt, content de pouvoir aider! – Phil

3

Essayez quelque chose comme ceci:

for (int i=0; i<100; i++) { 
    Button button = (Button) getLayoutInflater().inflate(R.layout.button_view, null); 
    // Do stuff to your button, add onClickListeners, etc. 
    rootView.addView(button); 
} 

rootView est un LinearLayout ou similaire que vous avez instancié plus tôt.

et res/layout/button_view.xml est quelque chose comme:

<Button xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 
+2

S'il vous plaît prêter attention http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ –

0

Eh bien, si vous avez besoin que beaucoup de boutons il n'y a rien que vous pouvez faire à ce sujet. Si vous voulez garder votre code court, vous pouvez avoir une boucle dans votre code Java, mais personnellement, je préfère la version XML parce que vous voyez alors votre mise en page directement dans votre IDE.

La seule chose que je pense que vaut la peine de faire est la création d'un nouveau style pour les boutons. Ils ont tous une taille de texte 18sp et vous voudrez peut-être ajouter d'autres attributs plus tard.

En outre, enlever layout_gravity = "center" et layout_weight = 1, ils ont aucun effet dans votre cas.

Et n'utilisez pas fill_parent, utilisez match_parent.

0

C'est beaucoup plus approprié de le faire en Java.

LinearLayout lay = (LinearLayout) findViewById(R.id.your_liner_layout); // Get the liner layout 

    for (i=0; i <= 100; i++) { 
    Button btn = new Button(this); // Create a button 

    btn.setGravity(Gravity.CENTER); // setting the gravity 

    btn.setText("button number " + i); //setting the text 

    LinearLayout.LayoutParams layout = new LayoutParams(LayoutParams.MATCH_PARENT, 0, 1); // Creating a LayoutParams : first args is the width, seconds the height and the last one the weight. 

    lay.addView(btn, layout); // Adding the button to the linear layout 
} 
Questions connexes