2012-09-09 91 views
42

我試圖在代碼中設置視圖的寬度和高度,以顯示我正在處理的免費應用的廣告。除此廣告外,所有界面均以XML格式完成。以下是顯示廣告的代碼。它在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); 

這會導致廣告以這種方式顯示。正如你所看到的寬度不完全填充整個頁面。

現在,當我更改代碼以這種嘗試設置大小:

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

我得到這個:

enter image description here

我已經嘗試了所有不同的組合FILL_PARENTWRAP_CONTENT全部具有相同的結果。有什麼我失蹤?或者我可以讓廣告填充設備的寬度而不填充高度?任何建議和幫助,不勝感激。

編輯當我試圖把它放在XML我得到一個異常:

<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

只是一個建議:你爲什麼不在xml中添加你想要的視圖(像com.ads.AdView這樣的完整類路徑 - 我剛剛創建了這個路徑,但你明白了),然後在你的Activity中訪問它findViewById(),並做任何你想要的東西? –

+0

我添加了在編輯中將其放入XML中時發生的情況。 –

+0

'mContext.getResources()。getDisplayMetrics().widthPixels * 3/4' –

回答

49

此代碼讓您將橫幅填充到最大寬度並保持比例。 這隻適用於肖像。旋轉設備時,您必須重新創建廣告。 在風景中,您應該直接離開廣告,因爲它會變得非常模糊。

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已棄用,在新的SDK中使用MATCH_PARENT – penduDev

+2

Display.getWidth()也被棄用。改用getSize()。 – Majestic

0

的第一個參數的LayoutParams是寬度,第二個是高度。所以如果你想要寬度是FILL_PARENT,但寬度是20px,那麼使用一些新的LayoutParams(FILL_PARENT,20)。當然,你不應該在你的代碼中使用實際的像素。您需要將其轉換爲與密度無關的像素,但您明白了。此外,您需要確保您的父母LinearLayout具有您正在尋找的正確寬度和高度。好像你想讓LinearLayout在寬度方向上填充父元素,然後讓adview也以witdh-wise的方式填充這個linearlayout,所以你可能需要指定android:layout_width:「fill_parent」和android:layout_height:「wrap_content」你的線性佈局的XML。

+0

我試過這個,我仍然得到相同的結果。 –

0

檢查它在MDPI裝置..如果廣告顯示正確,則誤差應在「PX」到「下降」轉換..

在代碼
6

添加以下線:

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

這似乎不是這個問題的答案。 – laalto

+0

我有類似的問題,以編程方式固定微調器的寬度,但最後上面的代碼爲我工作。 Adview是另一種觀點,所以同樣應該在這裏應用,還沒有實現,但理想情況下應該努力修復任何視圖Android支持的寬度。 – Ujjwal

53

您可以使用類似下面的代碼,如果你需要隻影響特定的值,而不是感動他人:

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

'wrap-content'呢? –

+0

常數WRAP_CONTENT = -2; 所以你可以嘗試像這樣view.getLayoutParams()。width = LayoutParams.WRAP_CONTENT; –

+1

出於某種原因view.getLayoutParams()。width = newWidht;和setWidth沒有相同的效果,你能解釋一下這個事實嗎? – benchuk

0
hsThumbList.setLayoutParams(new LayoutParams(100, 400)); 
相關問題