Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add button to a layout programmatically

I'm having trouble adding a button to a layout that I've created in XML. Here's what I want to achieve:

//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()));  } 

I want to add a Button to this new screen so that it'll appear below the graph. I've tried creating a LinearLayout view, then create a Button and add it to this view but I just get NullPointerExceptions..

Any help would be appreciated. Thanks

EDIT#1

Here's what I've tried using that created a NullPointerException and 'force close':

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);  } 

And here's the logcat error:

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 abviously more lines to do with this error in logcat, not sure if you want it?

EDIT#2

So i tried bhups method:

@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);            } 

This method produced the same logcat error as above, NullPointerException, indicating it was something to do with line no. 27 which is the layout.addView line of code. Any ideas? Thanks again

like image 734
mmmbaileys Avatar asked Feb 05 '11 15:02

mmmbaileys


2 Answers

If you just have included a layout file at the beginning of onCreate() inside setContentView and want to get this layout to add new elements programmatically try this:

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

then you can create a new Button for example and just add it:

Button bt = new Button(this); bt.setText("A Button"); bt.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,                                      LayoutParams.WRAP_CONTENT)); linerLayout.addView(bt); 
like image 64
Alex Cio Avatar answered Sep 19 '22 20:09

Alex Cio


This line:

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

Looks for the "statsviewlayout" id in your current 'contentview'. Now you've set that here:

setContentView(new GraphTemperature(getApplicationContext())); 

And i'm guessing that new "graphTemperature" does not set anything with that id.

It's a common mistake to think you can just find any view with findViewById. You can only find a view that is in the XML (or appointed by code and given an id).

The nullpointer will be thrown because the layout you're looking for isn't found, so

layout.addView(buyButton); 

Throws that exception.

addition: Now if you want to get that view from an XML, you should use an inflater:

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

assuming that you have your linearlayout in a file called "yourXMLYouWantToLoad.xml"

like image 45
Nanne Avatar answered Sep 18 '22 20:09

Nanne