title: What is the best way to instantiate widgets which are pre-defined in XML layouts in a custom View class?
body: <p>I am rather new to Android programming in general and am having particular difficulty with the xml/java UI shuffle... I have a layout which I would like to use as the view displayed when a custom, view class is instantiated in the activity class.  This much works fine by simply calling</p>
  
  <pre><code>setContentView(R.layout.mylayout) ;
  </code></pre>
  
  <p>in the activity or from the custom view class through a handle to the activity. The trouble comes when I wish to interact with the widgets on the layout-- I've tried getting a handle on the buttons with</p>
  
  <pre><code>myButton = (Button) findViewById(R.id.mybuttonid);
  </code></pre>
  
  <p>and separately with</p>
  
  <pre><code>Button myButton = new Button(contextHandle);
  myButton = (Button) findViewById(R.layout.mybuttonid);
  </code></pre>
  
  <p>but in both cases whenever I try to call any methods from the assumed myButton object I get a NullPointerException in the logcat report; evidently myButton is not properly instantiated in either case given above.  What is the proper way to instantiate components of a view in a case like this that combines xml and java so that they can call methods dynamically?</p>
  
  <p>thanks,
  CCJ</p>
  
  <p>EDIT: Thanks all for the replies, but I think up to 8/1/2011 the advice has been mostly targeted at an implementation wherein the widgets are to be instantiated in the activity class; I wish to instantiate widgets from an xml layout in a custom view class-- a class completely separate from the activity class which extends View and implements its own OnClickListener interface.  Below is my code:</p>
  
  <p>MyActivity Class:</p>
  
  <pre><code>package com.ccg.myactivity;
  
  import android.app.Activity;
  import android.os.Bundle;
  import android.util.Log;
  import android.view.MotionEvent;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;
  import android.widget.RadioButton;
  
  public class MyActivity extends Activity implements OnClickListener {
  private boolean touched = false;
  private RadioButton myRB;
  private Button runB;
  private CustomView myView; 
  
  
  
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.mainlayout);
      myRB = (RadioButton) findViewById(R.id.testrb);
      runB = (Button) findViewById(R.id.goButton);
      //set onClick listeners for activity class
      runB.setOnClickListener(this);
  }
  public void onResume(){
      super.onResume();
  
  }
  
  public void onClick(View v) {
      // do something when the button is clicked
      if (myRB.isChecked()){
          setContentView(R.layout.mylayout);
          myView = new CustomView(this,this); //passing in activity and context 
  //handles to custom View class
          //myView.getAnotherB().setOnClickListener(this); //commented out as we 
  //don't want to register the custom view's button with the Activty class's 
  //OnClickListener; instead it should be registered with the custom View class's own 
  //OnClickListener implementation.
  
      }
  
     else{
       Log.d("me","alt click");
     }
  
  }
  
  
  }
  </code></pre>
  
  <p>CustomView Class:</p>
  
  <pre><code>package com.ccg.myactivity;
  
  import android.app.Activity;
  import android.content.Context;
  import android.util.Log;
  import android.view.MotionEvent;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.*;
  import android.view.View.OnClickListener;
  
  public class CustomView extends View implements OnClickListener{
  
  private Button anotherB;
  
  private Context contextHandle;
  private Activity actHandle;
  
  public CustomView(Context context, Activity act) {
      super(context);
      contextHandle = context;
      actHandle = act;
      //anotherB = new Button(contextHandle); //this shouldn't be necessary for 
  //instantiation from XML widget
      initCustomView();
  
  }
  
  public void initCustomView(){
  
      anotherB = (Button) findViewById(R.id.nextbutton);
      anotherB.setOnClickListener(this);
  
  }
  
  
  public Button getAnotherB(){
      return anotherB;
  }
  
  
  @Override
  public void onClick(View arg0) {
      // TODO Auto-generated method stub
  
      Log.d("me", "Got the custom click!");
  }
  
  
  
  
  }
  </code></pre>
  
  <p>mainlayout.xml from which the default view is made:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;LinearLayout
  android:id="@+id/widget474"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"&gt;
  &lt;RadioGroup android:id="@+id/widget30" android:orientation="horizontal"   
  android:layout_x="2dip" android:layout_y="57dip" android:layout_width="match_parent" 
  android:layout_height="wrap_content"&gt;
  &lt;RadioButton android:layout_height="wrap_content" android:id="@+id/testrb"  
  android:textSize="15sp" android:text="Run" android:layout_width="wrap_content" 
  android:textColor="#ffff99ff"&gt;&lt;/RadioButton&gt;
  &lt;/RadioGroup&gt;
  &lt;Button android:layout_width="wrap_content" android:text="@string/RUN"  
  android:id="@+id/goButton" android:layout_height="wrap_content" 
  android:layout_x="222dip" android:layout_y="110dip"&gt;&lt;/Button&gt;
  &lt;/LinearLayout&gt;
  </code></pre>
  
  <p>mylayout.xml from which the custom view's layout is created:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;LinearLayout
  android:id="@+id/widget0"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"&gt;
  
  &lt;Button android:id="@+id/nextbutton" android:layout_height="wrap_content"   
  android:layout_width="wrap_content" android:text="work!!!"
  &gt; 
  &lt;/Button&gt;
  
  &lt;/LinearLayout&gt;
  </code></pre>
  
  <p>okay, if anybody can explain why any method calls from the button object anotherB (anotherB.setOnClickListener(this) above, but also the simpler anotherB.bringToFront()) cause a force close and a nullpointerexception in logcat with the above implementation I would be most appreciative.  thanks!
  CCJ</p>