Définir la largeur de vue par programme

J’essaie de définir la largeur et la hauteur d’une vue dans le code pour afficher une annonce pour une application gratuite sur laquelle je travaille. Toute l’interface utilisateur se fait en XML à l’exception de cette annonce. Voici le code qui affiche l’annonce. Il est dans onCreate .

 AdView adView = new AdView(this,"ad_url","my_ad_key",true,true); LinearLayout layout = (LinearLayout) findViewById(R.id.testing); adView.setAdListener(this); layout.addView(adView); 

Cela se traduit par l’affichage de l’annonce comme ceci. Comme vous pouvez le voir, la largeur ne remplit pas tout la page.

entrer la description de l'image ici

Maintenant, lorsque je change le code à ceci pour tenter de définir la taille:

 AdView adView = new AdView(this,"ad_url","my_ad_key",true,true); LinearLayout layout = (LinearLayout) findViewById(R.id.testing); adView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); adView.setAdListener(this); layout.addView(adView); 

J’ai compris:

entrer la description de l'image ici

J’ai essayé toutes les différentes combinaisons de FILL_PARENT et WRAP_CONTENT avec le même résultat. Y a-t-il quelque chose qui me manque? Ou une autre façon dont je peux faire en sorte que l’annonce remplisse la largeur de l’appareil sans remplir la hauteur? Toute suggestion ou aide est grandement appréciée.

EDIT quand je tente de le mettre en XML, je reçois une exception:

     

 > 09-09 22:39:43.448: E/AndroidRuntime(586): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jasoncrosby.app.tipcalculatorfree/com.jasoncrosby.app.tipcalculatorfree.MainActivity}: android.view.InflateException: Binary XML file line #14: Error inflating class com.adsdk.sdk.banner.AdView 09-09 22:39:43.448: E/AndroidRuntime(586): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1748) 09-09 22:39:43.448: E/AndroidRuntime(586): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764) 09-09 22:39:43.448: E/AndroidRuntime(586): at android.app.ActivityThread.access$1500(ActivityThread.java:122) 09-09 22:39:43.448: E/AndroidRuntime(586): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002) 09-09 22:39:43.448: E/AndroidRuntime(586): at android.os.Handler.dispatchMessage(Handler.java:99) 09-09 22:39:43.448: E/AndroidRuntime(586): at android.os.Looper.loop(Looper.java:132) 09-09 22:39:43.448: E/AndroidRuntime(586): at android.app.ActivityThread.main(ActivityThread.java:4025) 09-09 22:39:43.448: E/AndroidRuntime(586): at java.lang.reflect.Method.invokeNative(Native Method) 09-09 22:39:43.448: E/AndroidRuntime(586): at java.lang.reflect.Method.invoke(Method.java:491) 09-09 22:39:43.448: E/AndroidRuntime(586): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 09-09 22:39:43.448: E/AndroidRuntime(586): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 09-09 22:39:43.448: E/AndroidRuntime(586): at dalvik.system.NativeStart.main(Native Method) 09-09 22:39:43.448: E/AndroidRuntime(586): Caused by: android.view.InflateException: Binary XML file line #14: Error inflating class com.adsdk.sdk.banner.AdView 09-09 22:39:43.448: E/AndroidRuntime(586): at android.view.LayoutInflater.createView(LayoutInflater.java:579) 09-09 22:39:43.448: E/AndroidRuntime(586): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:671) 09-09 22:39:43.448: E/AndroidRuntime(586): at android.view.LayoutInflater.rInflate(LayoutInflater.java:724) 09-09 22:39:43.448: E/AndroidRuntime(586): at android.view.LayoutInflater.inflate(LayoutInflater.java:479) 09-09 22:39:43.448: E/AndroidRuntime(586): at android.view.LayoutInflater.inflate(LayoutInflater.java:391) 09-09 22:39:43.448: E/AndroidRuntime(586): at android.view.LayoutInflater.inflate(LayoutInflater.java:347) 09-09 22:39:43.448: E/AndroidRuntime(586): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:223) 09-09 22:39:43.448: E/AndroidRuntime(586): at android.app.Activity.setContentView(Activity.java:1780) 09-09 22:39:43.448: E/AndroidRuntime(586): at com.jasoncrosby.app.tipcalculatorfree.MainActivity.onCreate(MainActivity.java:95) 09-09 22:39:43.448: E/AndroidRuntime(586): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 09-09 22:39:43.448: E/AndroidRuntime(586): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1712) 09-09 22:39:43.448: E/AndroidRuntime(586): ... 11 more 09-09 22:39:43.448: E/AndroidRuntime(586): Caused by: java.lang.NoSuchMethodException:  [class android.content.Context, interface android.util.AtsortingbuteSet] 09-09 22:39:43.448: E/AndroidRuntime(586): at java.lang.ClassMembers.getConstructorOrMethod(ClassMembers.java:235) 09-09 22:39:43.448: E/AndroidRuntime(586): at java.lang.Class.getConstructor(Class.java:459) 09-09 22:39:43.448: E/AndroidRuntime(586): at android.view.LayoutInflater.createView(LayoutInflater.java:551) 09-09 22:39:43.448: E/AndroidRuntime(586): ... 21 more 

Ce code vous permet de remplir la bannière à la largeur maximale et de conserver le ratio. Cela ne fonctionnera qu’en portrait. Vous devez recréer l’annonce lorsque vous faites pivoter le périphérique. Dans le paysage, il vous suffit de laisser l’annonce telle quelle car elle sera assez floue.

 Display display = getWindowManager().getDefaultDisplay(); int width = display.getWidth(); double ratio = ((float) (width))/300.0; int height = (int)(ratio*50); AdView adView = new AdView(this,"ad_url","my_ad_key",true,true); LinearLayout layout = (LinearLayout) findViewById(R.id.testing); mAdView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT,height)); adView.setAdListener(this); layout.addView(adView); 

Vous pouvez utiliser quelque chose comme le code ci-dessous, si vous devez affecter uniquement une valeur spécifique et ne pas toucher les autres:

 view.getLayoutParams().width = newWidth; 

dans le code append la ligne ci-dessous:

 spin27.setLayoutParams(new LinearLayout.LayoutParams(200, 120)); 

Le premier paramètre de LayoutParams est la largeur et le second la hauteur. Donc, si vous voulez que la largeur soit FILL_PARENT, mais que la largeur soit, par exemple, 20px, utilisez quelque chose de nouveau LayoutParams (FILL_PARENT, 20). Bien sûr, vous ne devriez jamais utiliser les pixels réels dans votre code; vous devrez convertir cela en pixels indépendants de la densité, mais vous aurez l’idée. De plus, vous devez vous assurer que votre LinearLayout parent a la bonne largeur et la bonne hauteur que vous recherchez. Il semblerait que vous vouliez que LinearLayout remplisse le parent dans le sens de la largeur et que les fonctions de visualisation remplissent également cette ligne linéaire, vous devrez donc probablement spécifier android: layout_width: “fill_parent” et android: layout_height: “wrap_content” in votre disposition linéaire est xml.

vérifiez-le dans le périphérique mdpi. Si l’annonce s’affiche correctement, l’erreur doit être “px” pour “convertir” la conversion.

 hsThumbList.setLayoutParams(new LayoutParams(100, 400));