web-dev-qa-db-fra.com

android: LayoutParams for TextView fait disparaître la vue, par programme

Je l'ai touché sous différents angles. Fondamentalement, le Gist est ceci:

J'ai présenté un modèle en XML pour une interface qui doit être exécutée par programme afin qu'elle soit remplie de manière dynamique au cours de l'exécution.

Le problème ici est que XML TextView a quelques modifications de mise en page (qui fonctionnent) et sont nécessaires. Mais si je les mets en code, le TextView n’apparaîtra même pas.

(Le TextView, en passant, est imbriqué dans un TableRow, d'où l'appel du poids.) Le modèle XML que j'ai conçu en premier, à utiliser comme référence pour le code est le suivant, et il fonctionne parfaitement:

<TextView
  Android:id="@+id/txtviewWhiteBox"
  Android:layout_width="wrap_content"
  Android:layout_height="wrap_content"
  Android:layout_weight="1.0"
  Android:background="@drawable/textview_9patch_white"
  Android:gravity="center"
  Android:text="75"
  Android:textColor="@Android:color/black"
  Android:layout_margin="20dp"
  Android:padding="20dp"
  Android:textSize="40dp" />

Comme je l'ai dit, cela fonctionne parfaitement ... lorsque je lance la même disposition dans le code et que j'applique LayoutParams, le TextView disparaît.

Voici l'extrait pertinent:

int textViewExampleID = 9001;

private TextView txtviewExample = new TextView(this);

private void buildTextView(){   
    LayoutParams paramsExample = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,1.0f);
    txtviewExample.setId(textViewExampleID);
    txtviewExample.setBackgroundResource(R.drawable.textview_9patch_white);
    txtviewExample.setGravity(Gravity.CENTER);
    txtviewExample.setTextColor(getResources().getColor(Android.R.color.black));
    paramsExample.setMargins(20, 20, 20, 20);
    txtviewExample.setPadding(20, 20, 20, 20);
    txtviewExample.setTextSize(40); 
    txtviewExample.setText("customExample");

    //if I comment out the following line, this TextView displays.
    //if I leave it in, it doesn't display.
    txtviewExample.setLayoutParams(paramsExample);
}

Je réalise qu'il y a toutes sortes de classes disponibles pour LayoutParams, et je les ai toutes jouées LinearLayout.LayoutParams, TableView.LayoutParams, RelativeLayout.LayoutParams, LayoutParams tout seul ... Peu importe lequel I essayez, toute tentative d'appeler "setLayoutParams" rend tout le TextView parti . J'ai parcouru les forums ici, et je n'ai pas encore trouvé la réponse. Cela ne peut pas être si rare. 

25
Octoth0rpe

eh bien, c’était douloureux, mais j’ai enfin compris ce qui se passait ... La chose la plus importante à retenir (que je viens de réaliser) est que parmi toutes les myriades de LayoutParams, vous devez utiliser celle qui concerne le PARENT du voir sur lequel vous travaillez, pas la vue réelle.

Donc dans mon cas, j'essayais de faire fonctionner les marges TextView, mais elles étaient placées dans un TableRow. Le changement simple consistait à s'assurer que le type de LayoutParams utilisé était celui de TableRow:

private void buildTextView(){   
    // the following change is what fixed it
    TableRow.LayoutParams paramsExample = new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,1.0f);
    txtviewExample.setId(textViewExampleID);
    txtviewExample.setBackgroundResource(R.drawable.textview_9patch_white);
    txtviewExample.setGravity(Gravity.CENTER);
    txtviewExample.setTextColor(getResources().getColor(Android.R.color.black));
    paramsExample.setMargins(20, 20, 20, 20);
    txtviewExample.setPadding(20, 20, 20, 20);
    txtviewExample.setTextSize(40); 
    txtviewExample.setText("customExample");
    txtviewExample.setLayoutParams(paramsExample);
}

Merci les gars, j'espère que cela sera utile pour quelqu'un d'autre sur la ligne, car j'ai vu beaucoup de questions semi-liées dans les forums ici, mais pas celle qui définit vraiment le problème.

97
Octoth0rpe
private TextView txtviewExample = new TextView(this);

private void buildTextView(){   
    LayoutParams paramsExample = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,1.0f);
    txtviewExample.setId(textViewExampleID);
    txtviewExample.setBackgroundResource(R.drawable.textview_9patch_white);
    txtviewExample.setGravity(Gravity.CENTER);
    txtviewExample.setTextColor(getResources().getColor(Android.R.color.black));
    paramsExample.setMargins(20, 20, 20, 20);
    txtviewExample.setPadding(20, 20, 20, 20);
    txtviewExample.setTextSize(40); 
    txtviewExample.setText("customExample");

   setContentView(txtviewExample);//when you don't use SETTER method for TextView you can't view the desireable text on the UI//
}

//utilisation

1
killer

quelle est la 3ème variable supposée faire dans layoutparams, est-ce alpha? que se passe-t-il si vous commentez paramsExample.setMargins

enfin, que se passera-t-il si vous txtviewExample.setVisible(View.Visible) après setLayoutParams?

ce seraient les choses que j'essaierais si vous n'avez pas

0
CQM