2016-01-26 1 views
0

Je souhaite ajouter une nouvelle vue à un FrameLayout, mais cela ne fonctionne que "parfois". Par exemple: J'ai mis un OnClickListener à ma disposition (à l'intérieur de la méthode onCreate de l'activité) qui ajoute une nouvelle vue à la mise en page (cela fonctionne). Dans la méthode run de l'activité, j'utilise exactement le même code pour ajouter une telle vue, mais la vue n'apparaît pas. Je ne sais pas pourquoi ...La méthode addView n'affiche pas la nouvelle vue

Voici un code:

OnClickListener, ce qui ajoute une nouvelle vue de la mise en page et la vue montre réellement. layout est le FrameLayout, obstacles est une liste d'objets.

layout.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     obstacles.add(new Obstacle(getBaseContext(), 0, (int) ((scale * 570)/8), scale)); 
     layout.addView(obstacles.get(obstacles.size() - 1).view); 

    } 
}); 

instruction if est vrai, la nouvelle vue n'est pas affiché, mais la taille des obstacles et la childCount de la mise en page accroître à la fois par 1

if(checkForNew()){ 
    obstacles.add(new Obstacle(getBaseContext(), 0, (int) ((scale * 570)/8), scale)); 
    layout.addView(obstacles.get(obstacles.size() - 1).view); 
} 

Constructeur de Obstacle

public Obstacle(Context con, int left, int top, float scale) { 
    view = new ImageView(con); 
    view.setBackgroundColor(Color.rgb(0, 0, 0)); 
    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams((int)(scale*150), (int)(scale*20)); 
    params.setMargins(left,top,0,0); 
    view.setLayoutParams(params); 
    view.setMaxWidth(view.getLayoutParams().width); 
    view.setMaxHeight(view.getLayoutParams().height); 
} 

Ceci déplace les vues:

public void Move(View view, float speed, float scale){ 
    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(view.getWidth(), view.getHeight()); 
    params.setMargins(view.getLeft(), view.getTop() - (int) (scale * -speed), 0, 0); 
    view.setLayoutParams(params); 
} 
+0

run-méthode de l'activité ??? – Msp

+0

@Msp J'utilise un gestionnaire runnable, qui appelle la méthode – purpule

Répondre

1

Il s'agit d'un FrameLayout et les vues seront les unes au-dessus des autres.

Vous ne semblez pas changer l'échelle partout, et votre marge est toujours fixe avec 0, (scale * someValue)

Vous devez appliquer une échelle différente et/ou utiliser différents paramètres haut/gauche pour les vues que vous ajoutez.

+0

ils ne sont pas les uns sur les autres. si j'ajoute des vues avec le onclicklistener, les sont placées avec un topmargin de (570 * échelle)/8 donc si je déplace ces vues et clique, je peux voir la nouvelle vue juste à cette position. mais dans l'instruction if, la nouvelle vue n'est pas placée à cette position désirée – purpule

+0

@purpule oui, je vois ça. Mais où modifiez-vous cette échelle? Si vous ajoutez toutes les vues avec la même échelle, elles seront * l'une sur l'autre –

+0

l'échelle n'est pas modifiée. c'est mon échelle d'écran (scale = getResources(). getDisplayMetrics(). density;), donc je n'ai pas besoin de fonctionner avec des pixels absolus – purpule