2012-09-09 18 views
42

Próbuję ustawić szerokość i wysokość widoku w kodzie, aby wyświetlić reklamę bezpłatnej aplikacji, nad którą pracuję. Cały interfejs jest wykonywany w formacie XML z wyjątkiem tej reklamy. Oto kod wyświetlający reklamę. Jest to onCreate.Ustaw szerokość widoku programowo

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

Spowoduje to wyświetlenie reklamy w ten sposób. Jak widać szerokość nie wypełnia całkowicie całej strony.

Teraz, kiedy zmienić kod do tego, aby próbować ustawić rozmiar:

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

uzyskać to:

enter image description here

Próbowałem wszystkie różne kombinacje FILL_PARENT i WRAP_CONTENT wszystkie z tym samym wynikiem. Czy jest coś, czego mi brakuje? Lub w inny sposób mogę mieć reklamę wypełnić szerokość urządzenia bez wypełniania wysokości? Wszelkie sugestie i pomoc są mile widziane.

EDIT gdy próbuję umieścić go w XML otrzymuję wyjątek:

<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 
+0

Tylko sugestie: Dlaczego nie dodasz widoku, który chcesz w xml (pełna ścieżka klasy, jak com.ads.AdView - właśnie zrobiłem tę ścieżkę, ale masz rację), a następnie uzyskaj dostęp do niej w swojej Działalności z findViewById(), i robić, co chcesz z nim? –

+0

Dodałem, co się dzieje, gdy umieściłem go w XML w edycji. –

+0

'mContext.getResources(). GetDisplayMetrics(). WidthPixels * 3/4' –

Odpowiedz

49

Ten kod pozwala wypełnić baner do maksymalnej szerokości i zachować współczynnik. To będzie działać tylko w pozycji pionowej. Musisz odtworzyć reklamę po obróceniu urządzenia. W krajobrazie należy po prostu zostawić reklamę, ponieważ jest dość rozmyta.

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

FILL_PARENT przestarzałe, użyj MATCH_PARENT z nowym SDK – penduDev

+2

Display.getWidth() również przestarzałe. Zamiast tego użyj getSize(). – Majestic

0

Pierwszym parametrem LayoutParams to szerokość, a druga to wysokość. Jeśli chcesz szerokość FILL_PARENT, ale szerokość, powiedzmy, 20px, użyj czegoś nowego LayoutParams (FILL_PARENT, 20). Oczywiście nigdy nie powinieneś używać rzeczywistych pikseli w kodzie; musisz przekonwertować to na piksele niezależne od gęstości, ale masz pomysł. Musisz również upewnić się, że twój rodzic LinearLayout ma odpowiednią szerokość i wysokość, których szukasz. Wygląda na to, że chcesz, aby LinearLayout wypełnił rodzicom szerokość, a następnie sprawił, że widok adwokacki wypełniłby ten układ liniowy także w trybie witdh, więc prawdopodobnie musisz określić android: layout_width: "fill_parent" i android: layout_height: "wrap_content" w xml twojego układu liniowego.

+0

Próbowałem tego i nadal otrzymuję ten sam wynik. –

0

sprawdzić w urządzeniu MDPI .. Jeśli wyświetlacze reklam poprawnie, błąd powinien być w "px" na "dip" konwersji ..

6

w kodzie dodać poniżej linii:

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

To nie wydaje się być odpowiedź na to pytanie. – laalto

+0

Miałem podobny problem z ustalaniem szerokości przędzarki programowo, ale ostatecznie powyższy kod pracował dla mnie. Adview to kolejny widok, więc to samo powinno być tutaj zastosowane, nie zostało zaimplementowane, ale najlepiej powinno działać, aby naprawić szerokość dowolnego widoku androidowego wsparcia. – Ujjwal

53

można użyć coś takiego kodu poniżej, jeśli chcesz mieć wpływ tylko określoną wartość, a nie dotykać innych:

view.getLayoutParams().width = newWidth; 
+0

co z "wrap-content"? –

+0

Istnieje stała WRAP_CONTENT = -2; Możesz spróbować czegoś podobnego do view.getLayoutParams(). Width = LayoutParams.WRAP_CONTENT; –

+1

Z jakiegoś powodu view.getLayoutParams(). Width = newWidht; i setWidth nie mają tego samego efektu, czy możesz wyjaśnić ten fakt? – benchuk

0
hsThumbList.setLayoutParams(new LayoutParams(100, 400)); 
Powiązane problemy