Ansichtsbreite programmgesteuert einstellen

73

Ich versuche, die Breite und Höhe einer Ansicht im Code festzulegen, um eine Anzeige für eine kostenlose App zu schalten, an der ich arbeite. Die gesamte Benutzeroberfläche wird mit Ausnahme dieser Anzeige in XML erstellt. Hier ist der Code, der die Anzeige anzeigt. Es ist in 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);

Dies führt dazu, dass die Anzeige so angezeigt wird. Wie Sie sehen, füllt die Breite nicht die gesamte Seite aus.

Geben Sie hier die Bildbeschreibung ein

Wenn ich nun den Code in diesen ändere, um zu versuchen, die Größe einzustellen:

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);

Ich verstehe das:

Geben Sie hier die Bildbeschreibung ein

Ich habe alle verschiedenen Kombinationen von FILL_PARENTund WRAP_CONTENTalle mit dem gleichen Ergebnis ausprobiert . Fehlt mir etwas? Oder auf andere Weise kann ich die Anzeige die Breite des Geräts ausfüllen lassen, ohne die Höhe auszufüllen? Anregungen und Hilfe wird sehr geschätzt.

BEARBEITEN Wenn ich versuche, es in XML einzufügen, erhalte ich eine Ausnahme:

<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/main_layout">

<fragment
    android:name="com.jasoncrosby.app.tipcalculatorfree.MainButtonFragment"
android:id="@+id/button_frag"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>
<com.adsdk.sdk.banner.AdView
    android:id="@+id/banner"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"/>

</LinearLayout>

> 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: <init> [class android.content.Context, interface android.util.AttributeSet]
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
Jason Crosby
quelle
Nur ein Vorschlag: Warum fügen Sie nicht die gewünschte Ansicht in XML hinzu (vollständiger Klassenpfad wie com.ads.AdView - ich habe diesen Pfad gerade erstellt, aber Sie erhalten den Punkt) und greifen dann in Ihrer Aktivität mit findViewById ( ) und mach was du willst damit?
Balázs Édes
Ich habe hinzugefügt, was passiert, wenn ich es in der Bearbeitung in XML eingefügt habe.
Jason Crosby
mContext.getResources().getDisplayMetrics().widthPixels*3/4
Pratik Butani

Antworten:

71

Mit diesem Code können Sie das Banner bis zur maximalen Breite füllen und das Verhältnis beibehalten. Dies funktioniert nur im Hochformat. Sie müssen die Anzeige neu erstellen, wenn Sie das Gerät drehen. Im Querformat sollten Sie die Anzeige einfach so lassen, wie sie ist, da sie ziemlich groß und unscharf ist.

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);
Mobile Daten
quelle
8
FILL_PARENT veraltet, verwenden Sie MATCH_PARENT mit dem neuen SDK
penduDev
2
Display.getWidth () ist ebenfalls veraltet. Verwenden Sie stattdessen getSize ().
Majestic
@Majestic getSize (neuer Punkt) gibt void zurück, aber wir brauchen int. wie man diesen Wert bekommt
Girish
86

Sie können den folgenden Code verwenden, wenn Sie nur einen bestimmten Wert beeinflussen und andere nicht berühren müssen:

view.getLayoutParams().width = newWidth;
Serhii Nadolynskyi
quelle
Was ist mit "Wrap-Content"?
Francisco Corrales Morales
Es gibt die Konstante WRAP_CONTENT = -2; Sie können also Folgendes ausprobieren: view.getLayoutParams (). Width = LayoutParams.WRAP_CONTENT;
Serhii Nadolynskyi
3
Aus irgendeinem Grund view.getLayoutParams (). Width = newWidht; und setWidth haben nicht den gleichen Effekt. Können Sie diese Tatsache erklären?
Benchuk
2
Dies sollte ich als Antwort markiert haben, funktioniert besser und besser als Option mit der Erstellung neuer Layout-Parameter
Alexey Strakh
7

im Code unter der folgenden Zeile hinzufügen:

spin27.setLayoutParams(new LinearLayout.LayoutParams(200, 120));
Ujjwal
quelle
1
Dies scheint keine Antwort auf diese Frage zu sein.
Laalto
Ich hatte ähnliche Probleme, die Breite des Spinners programmgesteuert zu korrigieren, aber schließlich funktionierte der obige Code für mich. Adview ist eine andere Ansicht, daher sollte das gleiche hier angewendet werden, nicht implementiert haben, aber im Idealfall sollte funktionieren, um die Breite einer Ansicht Android-Unterstützung zu korrigieren.
Ujjwal
3
yourView.setLayoutParams(new LinearLayout.LayoutParams(width, height));
Hardik Patel
quelle
1
hsThumbList.setLayoutParams(new LayoutParams(100, 400));
Saurabh
quelle
0

Der erste Parameter für LayoutParams ist die Breite und der zweite die Höhe. Wenn Sie also möchten, dass die Breite FILL_PARENT, aber die Breite beispielsweise 20 Pixel beträgt, verwenden Sie etwas Neues LayoutParams (FILL_PARENT, 20). Natürlich sollten Sie niemals tatsächliche Pixel in Ihrem Code verwenden. Sie müssen das in dichteunabhängige Pixel umwandeln, aber Sie haben die Idee. Außerdem müssen Sie sicherstellen, dass Ihr übergeordnetes LinearLayout die richtige Breite und Höhe hat, die Sie suchen. Scheint so, als ob Sie möchten, dass das LinearLayout das übergeordnete Layout in der Breite ausfüllt und dann das Adview dieses Linearlayout auch in Bezug auf die Breite ausfüllt. Daher müssen Sie wahrscheinlich android: layout_width: "fill_parent" und android: layout_height: "wrap_content" angeben XML Ihres linearen Layouts.

Luxusmodus
quelle
0

Überprüfen Sie es im mdpi-Gerät. Wenn die Anzeige korrekt angezeigt wird, sollte der Fehler in der Konvertierung von "px" in "dip" liegen.

Zelva
quelle