Question

I have dynamically created spinner and button using layout-inflater. When I try to remove these with button click, I get the NullPointer Exception Error and the program just crashes when I run it.Here is my code:

public class MainActivity extends FragmentActivity implements OnClickListener{
SampleAlarmReceiver alarm = new SampleAlarmReceiver();
static EditText startTime;
static EditText endTime;
static EditText startDate;
static EditText EndDate;
View buttonRem;
Spinner spinnerNew;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    startTime = (EditText)findViewById(R.id.EditTextST);  
    startDate = (EditText)findViewById(R.id.editTextSD); 

    //Set up Click Listener for all Buttons
    View buttonAdd = findViewById(R.id.button1);
    buttonAdd.setOnClickListener(this);
            buttonRem = findViewById(R.id.buttonRem);
    buttonRem.setOnClickListener(this);

}

public void onClick(View v)
{
    switch(v.getId()){
    case (R.id.button1):

        RelativeLayout rootLayout = (RelativeLayout)findViewById(R.id.main_layout);

        //use layout inflater to create 'spinnerNew' on the fly
        final LayoutInflater spnInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        spinnerNew = (Spinner)spnInflater.inflate(R.layout.extra_spinner, null);
        rootLayout.addView(spinnerNew);

        //move the dynamic spinner to different position
        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)spinnerNew.getLayoutParams();
        params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        params.addRule(RelativeLayout.BELOW, R.id.spinner1);

        spinnerNew.setLayoutParams(params); //causes layout update

        //use layout inflater to create 'remove button' on the fly
        final LayoutInflater btnInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        buttonRem = (Button)btnInflater.inflate(R.layout.btn_remove, null);
        rootLayout.addView(buttonRem);

        //move the dynamic button to different position
        RelativeLayout.LayoutParams params1 = (RelativeLayout.LayoutParams)buttonRem.getLayoutParams();
        params1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        params1.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.spinnerNew);
    break;

    case(R.id.buttonRem):
        //spinnerNew.setVisibility(View.GONE); //does nothing
        //buttonRem.setVisibility(View.GONE);//does nothing
        ViewGroup layout = (ViewGroup) spinnerNew.getParent();
        if(null!=layout) 
           layout.removeView(spinnerNew);//does nothing
    break;
    }
}
Was it helpful?

Solution

   buttonRem = findViewById(R.id.buttonRem);
    buttonRem.setOnClickListener(this);

Above is getting called before inflation of the layout. Remove this from onCreate Move this to:

public void onClick(View v)
{
    switch(v.getId()){
    case (R.id.button1):

        RelativeLayout rootLayout = (RelativeLayout)findViewById(R.id.main_layout);

        //use layout inflater to create 'spinnerNew' on the fly
        final LayoutInflater spnInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        spinnerNew = (Spinner)spnInflater.inflate(R.layout.extra_spinner, null);
        rootLayout.addView(spinnerNew);

        //move the dynamic spinner to different position
        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)spinnerNew.getLayoutParams();
        params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        params.addRule(RelativeLayout.BELOW, R.id.spinner1);

        spinnerNew.setLayoutParams(params); //causes layout update

        //use layout inflater to create 'remove button' on the fly
        final LayoutInflater btnInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        buttonRem = (Button)btnInflater.inflate(R.layout.btn_remove, null);
        rootLayout.addView(buttonRem);

        //move the dynamic button to different position
        RelativeLayout.LayoutParams params1 = (RelativeLayout.LayoutParams)buttonRem.getLayoutParams();
        params1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        params1.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.spinnerNew);
        buttonRem.setLayoutParams(params1);
        buttonRem.setOnClickListener(this);//<-------------set onclick here
    break;

    case(R.id.buttonRem):
        //spinnerNew.setVisibility(View.GONE); //does nothing
        //buttonRem.setVisibility(View.GONE);//does nothing
        ViewGroup layout = (ViewGroup) spinnerNew.getParent();
        if(null!=layout) 
           layout.removeView(spinnerNew);//does nothing
    break;
    }
}

OTHER TIPS

Ah actually, I found out the problem - your spinnerNew reference is null in the second case (you don't bind the R.layout.extra_spinner) although you're using it. Try something like this in the second case:

case(R.id.buttonRem):
    final LayoutInflater spnInflater = (LayoutInflater) Context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    Spinner spinnerNew = (Spinner)spnInflater.inflater(R.layout.extra_spinner);
    spinnerNew.setVisibility(View.GONE);
    v.setVisibility(View.GONE);
    ViewGroup layout = (ViewGroup) spinnerNew.getParent();
    if(layout != null)
        layout.removeView(spinnerNew);
    break;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top