2013-05-20 64 views
0

我一直在寻找如何动态地添加按钮,并且始终找到相同或非常类似的解决方案,但它只是拒绝与我一起工作。每当我运行应用程序时,它立即崩溃,我不确定我做错了什么。当试图将按钮动态添加到布局时崩溃

public class FindCalls extends Activity { 
Button b; 
LinearLayout layout; 
LayoutParams lp; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_find_calls); 
    initialize(); 

} 

public void initialize() { 
    layout = (LinearLayout) findViewById(R.layout.activity_find_calls); 
    lp = new LayoutParams(LayoutParams.MATCH_PARENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT); 
    b = new Button(this); 

    layout.addView(b, lp); 
    setContentView(layout); 
    } 
} 

activity_find_calls xml包含一个LinearLayout。

logcat的

05-20 17:22:44.191: E/Trace(12959): error opening trace file: No such file or directory    (2) 
05-20 17:22:44.449: E/AndroidRuntime(12959): FATAL EXCEPTION: main 
05-20 17:22:44.449: E/AndroidRuntime(12959): java.lang.RuntimeException: Unable to      start activity ComponentInfo{com.example.callfinder/com.example.callfinder.FindCalls}:  java.lang.NullPointerException 
05-20 17:22:44.449: E/AndroidRuntime(12959): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2306) 
05-20 17:22:44.449: E/AndroidRuntime(12959): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2356) 
05-20 17:22:44.449: E/AndroidRuntime(12959): at android.app.ActivityThread.access$600(ActivityThread.java:150) 
05-20 17:22:44.449: E/AndroidRuntime(12959): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244) 
05-20 17:22:44.449: E/AndroidRuntime(12959): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-20 17:22:44.449: E/AndroidRuntime(12959): at android.os.Looper.loop(Looper.java:137) 
05-20 17:22:44.449: E/AndroidRuntime(12959): at android.app.ActivityThread.main(ActivityThread.java:5195) 
05-20 17:22:44.449: E/AndroidRuntime(12959): at java.lang.reflect.Method.invokeNative(Native Method) 
05-20 17:22:44.449: E/AndroidRuntime(12959): at java.lang.reflect.Method.invoke(Method.java:511) 
05-20 17:22:44.449: E/AndroidRuntime(12959): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
05-20 17:22:44.449: E/AndroidRuntime(12959): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
05-20 17:22:44.449: E/AndroidRuntime(12959): at dalvik.system.NativeStart.main(Native Method) 
05-20 17:22:44.449: E/AndroidRuntime(12959): Caused by: java.lang.NullPointerException 
05-20 17:22:44.449: E/AndroidRuntime(12959): at com.example.callfinder.FindCalls.initialize(FindCalls.java:28) 
05-20 17:22:44.449: E/AndroidRuntime(12959): at com.example.callfinder.FindCalls.onCreate(FindCalls.java:18) 
05-20 17:22:44.449: E/AndroidRuntime(12959): at android.app.Activity.performCreate(Activity.java:5104) 
05-20 17:22:44.449: E/AndroidRuntime(12959): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
05-20 17:22:44.449: E/AndroidRuntime(12959): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2260) 
05-20 17:22:44.449: E/AndroidRuntime(12959): ... 11 more 

当我注释掉布局的setContentView所以我有理由相信,是什么导致了问题的应用程序运行。

+1

什么是LogCat输出?并且顺便失去一个setContentView,它应该只是一个在onCreate –

+2

在你的'initialize()'方法中,'findViewById()'调用应该使用布局文件中'LinearLayout'的资源ID,而不是布局文件本身的ID。正如Marko Lazic所说,不要在'initialize()'方法中调用'setContentView'。 – Squonk

回答

1

findViewById(R.layout.activity_find_calls)

这是不正确的。 R.layout引用res/layout中的.xml布局文件,findViewById()需要来自R.id的标识符。因此,您可能会在此处获得null,并使用它导致NullPointerException

setContentView(layout)

不这样做无论是。假设您解决了上一个问题,您已经有了一个内容视图,其中此layout是一个孩子。

+0

这解决了它。非常感谢你 – Dzinic