2012-09-09 23 views
42

Sto cercando di impostare la larghezza e l'altezza di una vista nel codice per mostrare un annuncio per un'app gratuita su cui sto lavorando. Tutta l'interfaccia utente è realizzata in XML ad eccezione di questo annuncio. Ecco il codice che mostra l'annuncio. È in onCreate.Imposta larghezza vista a livello di codice

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

Ciò comporta che l'annuncio venga visualizzato in questo modo. Come puoi vedere, la larghezza non riempie l'intera pagina.

Ora, quando ho modificare il codice per questo per tentare di impostare le dimensioni:

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

ottengo questo:

enter image description here

Ho provato tutte le combinazioni differenti di FILL_PARENT e WRAP_CONTENT tutte con lo stesso risultato. C'è qualcosa che mi manca? O un altro modo in cui posso fare in modo che l'annuncio riempia la larghezza del dispositivo senza riempire l'altezza? Qualsiasi suggerimento e aiuto è molto apprezzato.

EDIT quando provo a metterlo in XML ottengo un'eccezione:

<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

Solo un suggerimento: Perché non aggiungi la Vista che vuoi in xml (percorso completo della classe come com.ads.AdView - ho appena creato questo percorso, ma ottieni il punto), quindi accedi alla tua attività con findViewById() e fai quello che vuoi con esso? –

+0

Ho aggiunto cosa succede quando lo metto in XML nella modifica. –

+0

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

risposta

49

Questo codice consente di riempire il banner alla larghezza massima e mantenere il rapporto. Funzionerà solo in verticale. È necessario ricreare l'annuncio quando si ruota il dispositivo. Nel paesaggio dovresti semplicemente lasciare l'annuncio perché è piuttosto sfocato.

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 deprecato, utilizzare MATCH_PARENT con il nuovo SDK – penduDev

+2

Display.getWidth() anche deprecato. Usa invece getSize(). – Majestic

0

Il primo parametro da LayoutParams è la larghezza e il secondo è l'altezza. Quindi se vuoi che la larghezza sia FILL_PARENT, ma la larghezza sia, ad esempio, 20px, quindi usa qualcosa di nuovo LayoutParams (FILL_PARENT, 20). Ovviamente non dovresti mai usare i pixel effettivi nel tuo codice; dovrai convertirlo in pixel indipendenti dalla densità, ma ti viene l'idea. Inoltre, devi assicurarti che la tua LinearLayout padre abbia la larghezza e l'altezza giuste che stai cercando. Sembra che tu voglia che il LinearLayout riempia il genitore in larghezza e poi abbia l'adview che riempie anche linearlayout witdh-wise, quindi probabilmente devi specificare android: layout_width: "fill_parent" e android: layout_height: "wrap_content" in il tuo xml del layout lineare.

+0

Ho provato questo e ho ancora lo stesso risultato. –

0

verificarlo nel dispositivo mdpi .. Se l'annuncio viene visualizzato correttamente, l'errore dovrebbe essere nel "px" conversione "tuffo" ..

6

nel codice aggiungono sotto la linea di:

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

Questa non sembra essere una risposta a questa domanda. – laalto

+0

Ho avuto un problema simile a risolvere la larghezza dello spinner in modo programmatico, ma alla fine il codice sopra ha funzionato per me. Adview è un'altra vista, quindi lo stesso dovrebbe essere applicato qui, non è stato implementato, ma idealmente dovrebbe funzionare per risolvere la larghezza di qualsiasi supporto Android vista. – Ujjwal

53

si può usare qualcosa come il codice qui sotto, se è necessario effetto solo valore specifico, e non toccare gli altri:

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

che dire di "wrap-content"? –

+0

C'è costante WRAP_CONTENT = -2; Quindi puoi provare qualcosa come this view.getLayoutParams(). Width = LayoutParams.WRAP_CONTENT; –

+1

Per qualche ragione view.getLayoutParams(). Width = newWidht; e setWidth non ha lo stesso effetto, puoi spiegare questo fatto? – benchuk

0
hsThumbList.setLayoutParams(new LayoutParams(100, 400)); 
Problemi correlati