以编程方式向布局添加按钮

时间:2011-02-05 15:13:22

标签: android button android-activity

我在向XML创建的布局中添加按钮时遇到了问题。这就是我想要实现的目标:

//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,以便它显示在图表下方。 我已尝试创建LinearLayout视图,然后创建Button并将其添加到此视图中,但我只是获得了NullPointerException ..

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

修改#1

以下是我尝试使用的创建NullPointerException和'强制关闭'的内容:

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)

在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代码行。有任何想法吗?再次感谢

2 个答案:

答案 0 :(得分:33)

如果您刚刚在onCreate() setContentView内的ViewGroup linearLayout = (ViewGroup) findViewById(R.id.linearLayoutID); 开头添加了布局文件,并希望以编程方式添加新元素,请尝试以下操作:

Button

然后您可以创建一个新的Button bt = new Button(this); bt.setText("A Button"); bt.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); linerLayout.addView(bt); ,例如只需添加它:

{{1}}

答案 1 :(得分:31)

这一行:

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

在您当前的“contentview”中查找“statsviewlayout”ID。现在你在这里设置:

setContentView(new GraphTemperature(getApplicationContext()));

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

认为你可以用findViewById查找任何视图是一个常见的错误。您只能找到XML中的视图(或由代码指定并给出id)。

将抛出nullpointer,因为找不到您要查找的布局,所以

layout.addView(buyButton);

抛出异常。

此外: 现在,如果您想从XML获取该视图,则应使用inflater:

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

假设您在名为“yourXMLYouWantToLoad.xml”的文件中使用了linearlayout