2013-04-14 61 views
0

我試圖添加按鈕的LinearLayout programmaticly,但應用程序崩潰:添加按鈕的LinearLayout不工作

activity_main.xml中:

<LinearLayout 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=".MainActivity" 
    android:id="@+id/main_view" > 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignRight="@+id/textView1" 
     android:layout_below="@+id/textView1" 
     android:text="Button" 
     android:onClick="onClickBtn" /> 

</LinearLayout> 

這裏是代碼:

package com.chovanec.runo; 

import android.os.Bundle; // and more 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    public void onClickBtn(View v) 
    { 
     Button btn = new Button(getBaseContext()); 
     btn.setText("New Button"); 

     LinearLayout l = (LinearLayout) findViewById(R.layout.activity_main); 
     l.addView(btn); 

    } 

} 

LogCat:

04-14 03:09:00.150: D/AndroidRuntime(7375): Shutting down VM 
04-14 03:09:00.150: W/dalvikvm(7375): threadid=1: thread exiting with uncaught exception (group=0x415102a0) 
04-14 03:09:00.155: E/AndroidRuntime(7375): FATAL EXCEPTION: main 
04-14 03:09:00.155: E/AndroidRuntime(7375): java.lang.IllegalStateException: Could not execute method of the activity 
04-14 03:09:00.155: E/AndroidRuntime(7375):  at android.view.View$1.onClick(View.java:3691) 
04-14 03:09:00.155: E/AndroidRuntime(7375):  at android.view.View.performClick(View.java:4211) 
04-14 03:09:00.155: E/AndroidRuntime(7375):  at android.view.View$PerformClick.run(View.java:17267) 
04-14 03:09:00.155: E/AndroidRuntime(7375):  at android.os.Handler.handleCallback(Handler.java:615) 
04-14 03:09:00.155: E/AndroidRuntime(7375):  at android.os.Handler.dispatchMessage(Handler.java:92) 
04-14 03:09:00.155: E/AndroidRuntime(7375):  at android.os.Looper.loop(Looper.java:137) 
04-14 03:09:00.155: E/AndroidRuntime(7375):  at android.app.ActivityThread.main(ActivityThread.java:4898) 
04-14 03:09:00.155: E/AndroidRuntime(7375):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-14 03:09:00.155: E/AndroidRuntime(7375):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-14 03:09:00.155: E/AndroidRuntime(7375):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
04-14 03:09:00.155: E/AndroidRuntime(7375):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
04-14 03:09:00.155: E/AndroidRuntime(7375):  at dalvik.system.NativeStart.main(Native Method) 
04-14 03:09:00.155: E/AndroidRuntime(7375): Caused by: java.lang.reflect.InvocationTargetException 
04-14 03:09:00.155: E/AndroidRuntime(7375):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-14 03:09:00.155: E/AndroidRuntime(7375):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-14 03:09:00.155: E/AndroidRuntime(7375):  at android.view.View$1.onClick(View.java:3686) 
04-14 03:09:00.155: E/AndroidRuntime(7375):  ... 11 more 
04-14 03:09:00.155: E/AndroidRuntime(7375): Caused by: java.lang.NullPointerException 
04-14 03:09:00.155: E/AndroidRuntime(7375):  at com.chovanec.runo.MainActivity.onClickBtn(MainActivity.java:37) 
04-14 03:09:00.155: E/AndroidRuntime(7375):  ... 14 more 
+0

這是您的線路37 –

+0

l.addView(BTN); – Michal

回答

2

應該是LinearLayout l = (LinearLayout) findViewById(R.id.main_view);

您還在你的線性佈局,這就是爲什麼新的按鈕沒有出現錯過android:orientation="vertical"。除非你想你的按鈕出現並列,那麼你必須改變android:layout_width="fill_parent"android:layout_width="wrap_content"在按鈕XML

,你不能使用

android:layout_alignRight="@+id/textView1" 
android:layout_below="@+id/textView1" 

,除非它是一個相對的佈局。

+0

我編輯了我的答案,以顯示爲什麼新按鈕沒有出現。 –

1

嘗試使用:

Button btn = new Button(this); 

代替:

Button btn = new Button(getBaseContext()); 

更新:

,並嘗試將按鈕添加到內部LinearLayout

LinearLayout l = (LinearLayout) findViewById(R.id.main_view); 

代替:

LinearLayout l = (LinearLayout) findViewById(R.layout.activity_main); 

我不認爲你可以直接添加按鈕到活動佈局。

+0

這沒有幫助,仍然崩潰 – Michal

+0

檢查編輯答案。 –

1

您的LinearLayout l實際上是null

更改此:

LinearLayout l = (LinearLayout) findViewById(R.layout.activity_main); 

要這樣:

LinearLayout l = (LinearLayout) findViewById(R.id.main_view); 
+0

給出已經給出兩次答案的要點是什麼? –

+0

這個改變是好的(防止崩潰),但新的按鈕不會出現 – Michal

+0

@EmilAdz你回答錯了 –

0

的問題是在這裏

LinearLayout l = (LinearLayout) findViewById(R.layout.activity_main); 
l.addView(btn); 

findViewById預計視圖元素的ID你給它佈局ID。

嘗試此

LinearLayout l = (LinearLayout) findViewById(android.R.id.content); 

LinearLayout l = (LinearLayout) findViewById(android.R.id.content).getRootView() 
相關問題