尝试访问父布局时出现空指针异常

时间:2011-06-30 04:02:29

标签: android android-layout relativelayout

我有一个相对布局,其中有三个按钮,我正在尝试动态更改相对布局的背景。这是xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="@drawable/mbi2"
            android:id="@+id/rlMain"
            android:layout_centerHorizontal="true">
    <Button android:text="Compose" 
            android:id="@+id/btnCompose" 
            android:layout_height="wrap_content"  
            android:layout_width="wrap_content"/>
    <Button android:text="Messages" 
            android:id="@+id/btnMessages" 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:layout_toRightOf="@id/btnCompose"/>
    <Button android:text="More &gt;&gt;" 
            android:id="@+id/btnMore" 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:layout_toRightOf="@id/btnMessages"/>                    
            </RelativeLayout>

这是给我一个错误的java代码

            RelativeLayout llMain=null;
    try {
        llMain = (RelativeLayout) findViewById(R.id.rlMain);
        Resources res = getResources();
        Drawable drawMbi = res.getDrawable(drawBgId);
        llMain.setBackgroundDrawable(drawMbi);          
    } catch (Exception e) {
        e.printStackTrace();
    }

错误是

06-29 23:56:41.099: WARN/System.err(8487): java.lang.NullPointerException
06-29 23:56:41.099: WARN/System.err(8487):     at com.me2youmob.cwrap.ChickenWrapActivity.loadMBIIntoView(ChickenWrapActivity.java:65)
06-29 23:56:41.099: WARN/System.err(8487):     at com.me2youmob.cwrap.ChickenWrapActivity.onCreate(ChickenWrapActivity.java:23)
06-29 23:56:41.099: WARN/System.err(8487):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1066)
06-29 23:56:41.099: WARN/System.err(8487):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2797)
06-29 23:56:41.108: WARN/System.err(8487):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2854)
06-29 23:56:41.108: WARN/System.err(8487):     at android.app.ActivityThread.access$2300(ActivityThread.java:136)
06-29 23:56:41.118: WARN/System.err(8487):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2179)
06-29 23:56:41.118: WARN/System.err(8487):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-29 23:56:41.118: WARN/System.err(8487):     at android.os.Looper.loop(Looper.java:143)
06-29 23:56:41.118: WARN/System.err(8487):     at android.app.ActivityThread.main(ActivityThread.java:5068)
06-29 23:56:41.118: WARN/System.err(8487):     at java.lang.reflect.Method.invokeNative(Native Method)
06-29 23:56:41.118: WARN/System.err(8487):     at java.lang.reflect.Method.invoke(Method.java:521)
06-29 23:56:41.118: WARN/System.err(8487):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
06-29 23:56:41.118: WARN/System.err(8487):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
06-29 23:56:41.118: WARN/System.err(8487):     at dalvik.system.NativeStart.main(Native Method)

这个问题的另一个问题是,早先我在线性布局中有按钮,然后在相对布局中。我认为它无法达到相对布局并删除线性布局部分。它仍然给我同样的错误。

知道这里发生了什么吗?

新更新:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    RelativeLayout rlM = (RelativeLayout) findViewById(R.id.rlMain);
    if (rlM == null)
    {
        Log.d("NULL CHECK","Layout is null");
    }
    else
    {
        Log.d("NULL CHECK","Layout is not null");
    }
    //spPreferences = getSharedPreferences(PREFS_NAME, 0);
    //loadMBIIntoView();
    //handleButtonClicks();
}

3 个答案:

答案 0 :(得分:1)

View.findViewById()函数只会查找您所在当前视图的子视图。

在这种情况下,您尝试在其中一个子视图中获取主视图,或者您尚未在Activity类中使用setContentView()

如果您尝试设置背景,我强烈建议您从活动中进行设置。

答案 1 :(得分:0)

我刚刚尝试你的代码,没问题,我认为你没有调用setContentView()。 ps:获取主视图的指针即可。

答案 2 :(得分:0)

另一种选择是像这样使用LayoutInflater:

LayoutInflater inflater = getLayoutInflater();
RelativeLayout rlMain = (RelativeLayout) inflater.inflate(R.layout.rlMain, null);

//do stuff with rlMain

setContentView(rlMain);