2013-03-19 237 views
1

我试图在我的第一个Android项目中配置AdMod。当我尝试运行该应用程序时,findViewByID始终返回null。AdMob findViewById返回null

这是我的主要活动的代码:

import android.app.Activity; 
import android.content.Context; 
import android.content.res.Configuration; 
import android.graphics.Bitmap; 
import android.graphics.Bitmap.Config; 
import android.os.Bundle; 
import android.os.PowerManager; 
import android.os.PowerManager.WakeLock; 
import android.view.Window; 


    import android.view.WindowManager; 

public abstract class MyAndroidApp extends Activity { 
    AdView adView; 
    public static final String MY_PUBLISHER_ID = "***********"; 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    AdRequest adRequest = new AdRequest(); 
    adRequest.addTestDevice(AdRequest.TEST_EMULATOR); 
    adView = new AdView(this, AdSize.BANNER, MY_PUBLISHER_ID); 

    //R.id.main has value, I can see it in Eclipse 
    RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.main); 


    if (mainLayout == null) 
     Log.d("Error","Layout is null"); 
    else 
    mainLayout.addView(adView); 

    adView.loadAd(adRequest); 

XML文件(下RES \布局)有以下几点:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MyApp"  
    android:id="@+id/main"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:text="@string/hello_world" /> 
</RelativeLayout> 

当我调试,我可以为R.看到价值id.main。但是,mainLayout的值仍然为空。

在此先感谢。

+0

为了使findViewById正常工作,您必须先前调用setContentView – 2013-03-19 20:45:05

回答

4

问题是,你是不是在调用的onCreate setContentView()()方法:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.layoutId); 
    RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.main); 
} 

没有它,你会得到永远NPE因为UI元素没有创建的实例(的setContentView方法的目的)和由findViewById()返回的查看被分配给NULL

因此,添加这一行,它应该工作。

1

在调用findViewById之前,应该调用setContentView方法并使用适当的布局。它通常被称为onCreate(Bundle savedInstance)方法。