以编程方式将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”的文件,
如果你刚刚在setContentView
的onCreate()
的开始部分包含了一个布局文件,并且希望得到这个布局以编程的方式添加新的元素,试试这个:
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);