Hi all,

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

setContentView(R.layout.mylayout) ;

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

myButton = (Button) findViewById(R.id.mybuttonid);

and separately with

Button myButton = new Button(contextHandle);
myButton = (Button) findViewById(R.layout.mybuttonid);

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?
Below is my code--

MyActivity Class:

<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>


CustomView Class:

<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>



mainlayout.xml from which the default view is made:

<code>
    <?xml version="1.0" encoding="utf-8"?>
    <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">
    <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">
    <RadioButton android:layout_height="wrap_content" android:id="@+id/
testrb"
    android:textSize="15sp" android:text="Run"
android:layout_width="wrap_content"
    android:textColor="#ffff99ff"></RadioButton>
    </RadioGroup>
    <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"></Button>
    </LinearLayout>
</code>



mylayout.xml from which the custom view's layout is created:

<code>
    <?xml version="1.0" encoding="utf-8"?>
    <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">

    <Button android:id="@+id/nextbutton"
android:layout_height="wrap_content"
    android:layout_width="wrap_content" android:text="work!!!"
    >
    </Button>

    </LinearLayout>
</code>


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

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to