Android NULL pointer Exception when trying to add a view - android

I am 2 days old to Android Programming. I may be comitting a mistake at the core level. If this is the case, pardon.
I am trying to add a text box to a Relative Layout. When a button is clicked.
The method is bound to the button by the attribute android:onClick="method"
By doing the below.
public method (View view){
RelativeLayout vRL = (RelativeLayout)findViewById(R.layout.rLayout);
TextView vET = new TextView(this);
vET.setText("Text added to view.");
vET.setId(1);
vRL.addView(vET);
setContentView(R.layout.rLayout);
}
But I am getting a null pointer exception at vRL.addView(vET);
what is it that I am doing wrong? -OR-
Am I not adding the TextView element properly?

in below line
RelativeLayout vRL = (RelativeLayout)findViewById(R.layout.rLayout);
change the R.layout.rLayout to R.id.rLayout

setContentView(R.layout.rLayout);
put this line in onCreate() of Activity..
and this line from method()
RelativeLayout vRL = (RelativeLayout)findViewById(R.id.rLayout);

Replace below line with
`RelativeLayout vRL = (RelativeLayout)findViewById(R.id."id name of relative layout");`

Change like this:
public method (View view){
RelativeLayout vRL = (RelativeLayout)findViewById(R.id.rLayout);
TextView vET = new TextView(this);
vET.setText("Text added to view.");
vET.setId(1);
vRL.addView(vET);
setContentView(R.layout.rLayout);
}

change the R.layout.rLayout to R.id.rLayoutR.layout.rLayout);

Related

findViewById for dynamically added View

Is it possible to find the added TextView to update it with other options.
I am adding by this code new TextView with a Button. Now, I want also set a onClickListerner for the dynamically added TextViews. For this I have to find them with findViewById method. But they aren't createt yet.
Can I make this in a other way and if yes, How?
Button hinzufügenButton = (Button) findViewById(R.id.hinzufügen_Button);
hinzufügenButton.setOnClickListener(new Button.OnClickListener() {
public void onClick (View view){
EditText tischName = (EditText) findViewById(R.id.tisch_name_EditText);
TextView tisch = new TextView(getApplicationContext());
tisch.setText(tischName.getText());
tisch.setAllCaps(true);
tisch.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
tisch.setBackgroundColor(Color.parseColor("#9FA8DA"));
tisch.setTextSize(25);
tisch.setId(id);
id++;
LinearLayout tischeAnzeigen = (LinearLayout) findViewById(R.id.tische_LinearLayout);
tischeAnzeigen.addView(tisch);
}
});
Just add the onClickListener as you create your dynamic views
Example:
...
tisch.setId(id);
tisch.setOnClickListener(yourListener);
...
You can use setId to add an id. But you probably don't need to. If you're creating a view dynamically, you have a reference to it when you create it. Just set it on that reference. No need to find it.

Clicking twice on a radiobutton generates illegalstateexception

I am getting an object of RadioButton by using findViewById() and then setting an `onclicklistener' for it.The code goes like :
final EditText editTextView = (EditText)findViewById(2001);
RadioButton rb = (RadioButton) findViewById(R.id.radio3);
rb.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.editTextGroupLayout);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
editTextView.setLayoutParams(params);
editTextView.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL| InputType.TYPE_NUMBER_FLAG_SIGNED);
editTextView.setId(2001);
linearLayout.addView(editTextView);
}
});
When i click Once on the radiobutton it works fine.But when i click it twice,it generates
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
By clicking it twice why this exception occurs?
What i tried
I tried to remove the line final EditText editTextView = (EditText)findViewById(2001);
and add this line inside the onClick(),EditText editTextView = (EditText)findViewById(2001);.But by doing this it doesn't get executed even once.It shows exception too.
It is beacouse you got only one instance of edittext which alerady has a parent after first click. Try to remove view from parent and than place it again.
Or maybe try to show/hide it?
You should propably do something like this.
linearLayout.removeAllViews(); or linearLayout.removeView(editTextView);
...
linearLayout.addView(editTextView);

How can I remove / delete a dynamically generated button in Android?

So I generated some button. The numbers it depends on the user (when clicked a button, create a new one).
This is how I made it:
RelativeLayout layout = (RelativeLayout) findViewById(R.id.layoutcprompt);
RelativeLayout.LayoutParams OBJ = new RelativeLayout.LayoutParams (140,80);
if ((commandsi%6)==0) {adjust=adjust+86; commandsi=1;}
OBJ.leftMargin =(140*(commandsi-1))+10;
OBJ.topMargin =250+adjust;
Button command = new Button(this);
command.setLayoutParams(OBJ);
command.setId(ID);
command.setText(edittxt.getText().toString());
edittxt.setText("");
command.setBackgroundResource(R.drawable.costum_button);
command.setTextColor(Color.WHITE);
command.setTextSize(14);
layout.addView(command);
command.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Button b = (Button)view;
scommand=b.getText().toString();
}
});
command.setVisibility(View.VISIBLE);
I want to remove/delete them, but I don't know how.... I gave them a unique id, but I still dunno how can I remove them :/
I cannot comment another post, but using
command = new Button(this)
might involve an implicit memory Leak on this! (which can be the Activity). Rather use Context object. Or remove the button at least.
Then because you have the parent of your Button. Just remove it:
ViewGroup layout = (ViewGroup) findViewById(R.id.layoutcprompt);
View command = layout.findViewById(ID);
layout.removeView(command);
Make command a global variable. Then you can access it later, and call command.setVisibility(View.GONE);
So at the top, of your class file, you would declare the global variable:
Button command;
Then remove the redefinition later on and instead assign to the global variable:
command = new Button(this);
Then when you want to hide it, call:
command.setVisibility(View.GONE);
Try using the documentation, 5 seconds of research can lead you to the RemoveView method.
layout.removeView(command);
Update
If you have a null pointer exception on this line, means your layout is null, not your command. Make your layout variable global for that class.
Also be sure to keep different variables for each of your created buttons. If you have a global variable, and create 10 buttons using the same variable you will only have a reference to the last one created. If you explain exactly when you want to remove the button we might be able to help you further.
As an example, if you want to remove the button when the user clicks on it you can change your clickListener:
command.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Button b = (Button)view;
scommand=b.getText().toString();
layout.removeView(view);
}
});
One other implementation that may help others who view this thread is that you can consider removing all the child elements in the parent layout. Once you get the view's parent (which I assume is a layout container),you can remove all the child elements.
command.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
ViewGroup vg = (ViewGroup)view.getParent();
vg.removeAllViews();
}
});
You can also do it like this for security purpose:
ViewGroup layout = (ViewGroup) command.getParent();
if(null!=layout) //for safety only as you are doing onClick
layout.removeView(command);
You can also use this snipper
For Adding the Button
LinearLayout dynamicview = (LinearLayout)findViewById(R.id.buttonlayout);
LinearLayout.LayoutParams lprams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
Button btn = new Button(this);
btn.setId(count);
final int id_ = btn.getId();
btn.setText("Capture Image" + id_);
btn.setTextColor(Color.WHITE);
btn.setBackgroundColor(Color.rgb(70, 80, 90));
dynamicview.addView(btn, lprams);
btn = ((Button) findViewById(id_));
btn.setOnClickListener(this);
For removing the button
ViewGroup layout = (ViewGroup) findViewById(R.id.buttonlayout);
View command = layout.findViewById(count);
layout.removeView(command);

Creating button dynamically

hey guys need a little help........my intention is to develop an app which contains just a button... and on clicking it it must create another button on the screen dynamically.......
here's my code...
public void onClick(View v) {
// TODO Auto-generated method stub
Button bee=new Button(getBaseContext());
bee.setText("hello:");
RelativeLayout a;
a=(RelativeLayout)findViewById(R.layout.activity_main);
a.addView(bee,new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
}
});
this code is error free but when executed says "unfortunately 'myapplication' has stopped"....
pls do help guys..( my sole aim is to create widgets dynamically ,hence tried dis program). if u have any other suggestions pls post nd comment
a=(RelativeLayout)findViewById(R.layout.activity_main);
activity_main is a layout, not a RelativeLayout widget!
you should use
a=(RelativeLayout)findViewById(R.id.my_relative_layout);
Please post the stack trace (logcat) so you will get better and faster answer.
Try this.
RelativeLayout rLayout = (RelativeLayout )findViewById(R.id.relativeLayout); // Here this should be id of your relative layout.
Button btn = new Button(this);
rLayout.addView(btn);
try with this code i think you are getting problem just because of not setting the parameters properly so check with this code-
LinearLayout container = (LinearLayout)findViewById(R.id.container);
Button btn = new Button(this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
btn.setLayoutParams(lp);
container.addView(btn);
You are finding id rather then layout
so change this line:
a=(RelativeLayout)findViewById(R.id.activity_main);
You are trying to "find" a layout which can't exist! Please, make sure you have defined a RealtiveLayout with a valid id and then do
a=(RelativeLayout)findViewById(R.id.valid_layout_id);
instead of
a=(RelativeLayout)findViewById(R.layout.activity_main);

Get reference to Views in my Android Activity

I have a LinearLayout comprising of a few Buttons and I add this to my activity in the onCreate(..) method with setContentView(R.layout.myscreen). No surprises so far.
How do I get a reference to an iterator to these buttons? I'd like to add listeners to them but I'd rather not directly reference the Button's using their android:id.
Similar questions have been asked here and here but they don't quite answer my question.
Try something like this provide an id root_layout in xml to LinearLayout
LinearLayout mLayout = (LinearLayout) findViewById(R.id.root_layout);
for(int i = 0; i < mLayout.getChildCount(); i++)
{
Button mButton = (Button) mLayout.getChildAt(i);
mButton.setOnClickListener(this);
}
Where mLayout is object of you Linear Layout and Your activity must implements OnClickListener and here goes general listener
#Override
public void onClick(View v)
{
Button mButton = (Button)v;
String buttonText = mButton.getText().toString();
}
NOTE: For this to work properly you Linear Layout must only contains button no other views
You should take a look at my answer here.
In short. I'd assign the buttons a listener by setting the onClick attribute in the XML layout on each Button.
Inside of your Activity you'll need a public method like the one below which basically is what you want to do in your listener.
public void myFancyMethod(View v) {
// do something interesting here
}
If you want to go for accessing other elements you may try following syntax:
<ElementClass> <referencevariable> = (<ElementClass>) findViewById(R.id.<id_of_the_element>);
For Example:
TextView textView= (TextView) findViewById(R.id.t1); //I used t1 to refer my textview in the Layout.
This might work.
Then you can use these views with their inbuilt methods to perform as many as work you want.

Categories

Resources