以编程方式将button添加到布局

我无法将button添加到我在XML中创build的布局中。 这是我想要达到的:

//some class else { startActivity(new Intent(StatisticsScreen.this, ScreenTemperature.class)); } //// //ScreenTemperatureClass @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //this is where I call another class that //displays a nice graph setContentView(new GraphTemperature(getApplicationContext())); } 

我想添加一个Button到这个新的屏幕,以便它会出现在图表下方。 我已经尝试创build一个LinearLayout视图,然后创build一个Button ,并将其添加到此视图,但我只是得到NullPointerException s ..

任何帮助,将不胜感激。 谢谢

编辑#1

以下是我尝试使用创build一个NullPointerException和'强制closures':

 Button buybutton; LinearLayout layout; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new GraphTemperature(getApplicationContext())); layout = (LinearLayout) findViewById(R.id.statsviewlayout); Button buyButton = new Button(this); buyButton.setText(R.string.button_back); buyButton.setLayoutParams(new LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); layout.addView(buyButton); } 

这里是logcat错误:

 ERROR/AndroidRuntime(293): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.weatherapp/com.weatherapp.ScreenTemperature}: java.lang.NullPointerException ERROR/AndroidRuntime(293): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) ERROR/AndroidRuntime(293): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) ERROR/AndroidRuntime(293): at android.app.ActivityThread.access$2300(ActivityThread.java:125) ERROR/AndroidRuntime(293): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 

theres显然更多的线logcat做这个错误,不知道如果你想要它?

编辑#2

所以我尝试了bhups方法:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GraphTemperature GT = new GraphTemperature(getApplicationContext()); layout = (LinearLayout) findViewById(R.id.statsviewlayout); Button buyButton = new Button(this); buyButton.setText(R.string.button_back); buyButton.setLayoutParams(new LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); layout.addView(GT); // line 27 layout.addView(buyButton); setContentView(layout); } 

这个方法产生了与上面相同的logcat错误, NullPointerException ,表示这是与行号有关。 27这是layout.addView一行代码。 有任何想法吗? 再次感谢

这一行:

 layout = (LinearLayout) findViewById(R.id.statsviewlayout); 

在当前的“contentview”中查找“statsviewlayout”id。 现在你已经在这里设置:

 setContentView(new GraphTemperature(getApplicationContext())); 

而且我猜测新的“graphTemperature”没有设置任何与该ID。

这是一个常见的错误,认为你可以用findViewByIdfind任何视图。 你只能find一个在XML中的视图(或由代码指定并给定一个id)。

因为您正在寻找的布局没有find,所以会抛出空指针

 layout.addView(buyButton); 

抛出exception。

另外:现在,如果你想从XML中获得这个视图,你应该使用一个inflater:

 layout = (LinearLayout) View.inflate(this, R.layout.yourXMLYouWantToLoad, null); 

假设你有一个名为“yourXMLYouWantToLoad.xml”的文件,

如果你刚刚在setContentViewonCreate()的开始部分包含了一个布局文件,并且希望得到这个布局以编程的方式添加新的元素,试试这个:

 ViewGroup linearLayout = (ViewGroup) findViewById(R.id.linearLayoutID); 

那么你可以创build一个新的Button ,例如,只需添加它:

 Button bt = new Button(this); bt.setText("A Button"); bt.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); linerLayout.addView(bt);