2011-02-05 92 views
31

我无法将按钮添加到我在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中显然有更多的线路处理这个错误,不确定是否需要它?

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

+1

让我们了解您尝试与logcat的你得到运行,所以我们试图找出为什么你NPE反正考虑创建一个`screen_temperature.xml`布局和使用,在`的setContentView()`。你可以通过指定整个包来添加xml自定义视图,而不仅仅是名称(即:``) – bigstones 2011-02-05 15:29:16

+0

创建线性布局(ll)并添加GraphTemp视图对象和按钮对象为ll。然后将活动的内容视图设置为ll。即setContentView(ll); – bhups 2011-02-05 15:39:23

回答

31

这条线:

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

会在当前的 '内容查看' 的 “statsviewlayout” ID。现在你已经设置的位置:

setContentView(new GraphTemperature(getApplicationContext())); 

而且我猜测,新的“graphTemperature”不设置与ID事情。

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

的空指针将被抛出,因为你正在寻找的布局没有找到,所以

layout.addView(buyButton); 

抛出该异常。

另外: 现在,如果你想从XML这种观点,你应该使用吹气:

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

假设你有你的LinearLayout在一个名为“yourXMLYouWantToLoad文件。XML”

+0

你能看看我的第二次编辑?我几乎在发布这个答案的同时发布了它。我不太确定我的理解。布局“statsviewlayout”是在xml中声明的,如果多数民众赞成你问什么? – mmmbaileys 2011-02-05 16:01:51

31

如果你只是已包括在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); 
相关问题