2013-08-31 51 views
0

我正在为我的应用程序编写一个“欢迎屏幕”,该应用程序在应用程序第一次启动时运行。 我想要的:一个透明的布局,通过代码动态重叠在根布局上。这样的形象:动态添加布局以重叠其他布局

enter image description here

但是当我跑我的应用程序,它崩溃由于NullPointerException异常。即使我没有添加第二个布局

问题1:为什么第一个布局不显示,应用程序崩溃?

问题2:如何显示第二个布局?

在此先感谢....

Authentication.java

import component.Util; 

public class Authentication extends Activity { 

     private RelativeLayout rootLayout; 
     public static Context CONTEXT; 
     public Authentication(){ 
      CONTEXT=this; 
    } 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    rootLayout=new RelativeLayout(CONTEXT); 
    LinearLayout firstLayout=(LinearLayout) findViewById(R.layout.authentication); 

    rootLayout.addView(firstLayout); 
    setContentView(rootLayout); 

    if(Util.isFirstLaunch(CONTEXT)){ 
     //Add the second layout 
    } 
    } 
} 

authentication.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/authentication" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:background="@drawable/background" > 
<TextView 
    android:id="@+id/textView_login" 
    android:layout_width="210dp" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="20dp" 
    android:layout_marginBottom="12dp" 
    android:layout_marginLeft="4dp" 
    android:layout_marginRight="4dp" 
    android:layout_gravity="center_horizontal" 
    android:text="@string/loginText" 
    android:textSize="18sp" /> 

<EditText 
    android:id="@+id/editText_username" 
    android:layout_width="210dp" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="4dp" 
    android:layout_marginBottom="4dp" 
    android:layout_marginLeft="4dp" 
    android:layout_marginRight="4dp" 
    android:layout_gravity="center_horizontal" 
    android:nextFocusDown="@+id/editText_password" 
    android:inputType="textPersonName" 
    android:hint="@string/username" /> 

<EditText 
    android:id="@+id/editText_password" 
    android:layout_width="210dp" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="4dp" 
    android:layout_marginBottom="12dp" 
    android:layout_marginLeft="4dp" 
    android:layout_marginRight="4dp" 
    android:layout_gravity="center_horizontal" 
    android:inputType="textPassword" 
    android:hint="@string/password" /> 

<Button 
    android:id="@+id/button_submit" 
    android:layout_width="140dp" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="14dp" 
    android:layout_gravity="center_horizontal" 
    android:background="@drawable/button" 
    android:text="@string/submit" 
    android:textColor="#e1ecff" /> 

</LinearLayout> 

堆栈跟踪:

08-31 13:50:32.623: D/AndroidRuntime(5740): Shutting down VM 
08-31 13:50:32.623: W/dalvikvm(5740): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 
08-31 13:50:32.643: E/AndroidRuntime(5740): FATAL EXCEPTION: main 
08-31 13:50:32.643: E/AndroidRuntime(5740): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.shayan.filesharing/com.shayan.filesharing.Authentication}: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.RelativeLayout 
08-31 13:50:32.643: E/AndroidRuntime(5740):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
08-31 13:50:32.643: E/AndroidRuntime(5740):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
08-31 13:50:32.643: E/AndroidRuntime(5740):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
08-31 13:50:32.643: E/AndroidRuntime(5740):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
08-31 13:50:32.643: E/AndroidRuntime(5740):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-31 13:50:32.643: E/AndroidRuntime(5740):  at android.os.Looper.loop(Looper.java:137) 
08-31 13:50:32.643: E/AndroidRuntime(5740):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
08-31 13:50:32.643: E/AndroidRuntime(5740):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-31 13:50:32.643: E/AndroidRuntime(5740):  at java.lang.reflect.Method.invoke(Method.java:511) 
08-31 13:50:32.643: E/AndroidRuntime(5740):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
08-31 13:50:32.643: E/AndroidRuntime(5740):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
08-31 13:50:32.643: E/AndroidRuntime(5740):  at dalvik.system.NativeStart.main(Native Method) 
08-31 13:50:32.643: E/AndroidRuntime(5740): Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.RelativeLayout 
08-31 13:50:32.643: E/AndroidRuntime(5740):  at com.shayan.filesharing.Authentication.onCreate(Authentication.java:22) 
08-31 13:50:32.643: E/AndroidRuntime(5740):  at android.app.Activity.performCreate(Activity.java:5104) 
08-31 13:50:32.643: E/AndroidRuntime(5740):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
08-31 13:50:32.643: E/AndroidRuntime(5740):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
08-31 13:50:32.643: E/AndroidRuntime(5740):  ... 11 more 
+4

的'Context'有效只与'onCreate'方法启动,所以请不要做'CONTEXT =这一点;'的'Activity'的构造。 – Luksprog

回答

2

首先,删除你的构造函数。不要在Activity上实现构造函数。你不需要一个,并且你错误地实现了它(没有链接到超类)。

二,删除你的CONTEXT静态数据成员。不要把Activity放在静态数据成员中,因为你会泄漏内存。在您的onCreate()方法中将所有对CONTEXT的引用替换为this

+0

我需要CONTEXT实例化我的一个类,在onClickListener中,其中“this”引用View.onClickListener,而不是Activity的上下文。我该怎么做呢? –

+0

@Shayan_Aryan:“我该怎么办?” - 使用'Authentication.this',而不是'CONTEXT'。 – CommonsWare

+0

感谢您的信息,我做了你所说的。但应用程序仍然崩溃! –

0

纠正2件事情,并解决问题。

1:使用内部addView(),和的FrameLayout代替的RelativeLayout

2所述的LayoutParams:使用getLayoutInflater.inflate()而不是findViewByID()。因为当根布局尚未显示(不充气)时,我们无法调用findViewByID()。

Authentication.java:

import component.Util; 

public class Authentication extends Activity { 
    private FrameLayout rootLayout; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    rootLayout=new FrameLayout(this); 
    LinearLayout authenticationView=(LinearLayout) getLayoutInflater().inflate(R.layout.authentication, rootLayout, false); 
    rootLayout.addView(authenticationView,FrameLayout.LayoutParams.MATCH_PARENT); 

    setContentView(rootLayout); 
    if(Util.isFirstLaunch(this)){ 
     ImageView image=(ImageView) getLayoutInflater().inflate(R.layout.first_run_info,rootLayout,false); 
     rootLayout.addView(image,FrameLayout.LayoutParams.WRAP_CONTENT); 
    } 
    } 
}