DeekMan
DeekMan

Reputation: 13

Custom Component class methods are throwing error when called

I've created a Custom Component in layout/XML which has 2 TextViews and 2 Buttons. In its supporting class I simply have buttons increment and decrement the value of one of the TextViews

public class NumberStepper extends LinearLayout implements View.OnClickListener {

//Define the elements (Children) of the compound view
public TextView tvStepperName, tvStepperValue;
public Button btnIncrement, btnDecrement;

private int statValue;
public NumberStepper(Context context, AttributeSet attrs) {
    super(context, attrs);
    //tvStepperName.setText(name);
    statValue = 0;

    LayoutInflater inflater = LayoutInflater.from(context);
    inflater.inflate(R.layout.numberstepper, this);
    loadComponents();

    }
private void loadComponents(){
    tvStepperName = (TextView) findViewById(R.id.tvStepperName);
    tvStepperValue = (TextView) findViewById(R.id.tvStepperValue);
    btnIncrement = (Button) findViewById(R.id.btnIncrement);
    btnDecrement = (Button) findViewById(R.id.btnDecrement);

    btnIncrement.setOnClickListener(this);
    btnDecrement.setOnClickListener(this);

    tvStepperValue.setText("" + statValue);

}

public void setLabel(String str){
    tvStepperName.setText(str);
}
public void onClick(View v) {
    switch(v.getId()){
    case R.id.btnIncrement:
            statValue++;
            tvStepperValue.setText("" + statValue);
            tvStepperName.setText("HELLO");
        break;
    case R.id.btnDecrement:
        if(statValue > 0){
            statValue--;
        }
        tvStepperValue.setText("" + statValue);
        break;
    }

}

}

Next I created another XML layout that has 5 or 6 of these compound components

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.nsholmes.bballStats.componets.NumberStepper
    android:id="@+id/ccOne"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"></com.nsholmes.bballStats.componets.NumberStepper>
<com.nsholmes.bballStats.componets.NumberStepper
    android:id="@+id/ccTwo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"></com.nsholmes.bballStats.componets.NumberStepper>

In this layout's support class (which extends Activity) I set the compound component variables, setContentView(),and I attempt the following:

ccOne = (NumberStepper)findViewById(R.id.ccOne);
    ccOne.setLabel("Label Name");

I get an error stating - Unable to start activity ComponentInfo). I only get this error when I call setLabel().

07-31 17:54:25.657: E/AndroidRuntime(11454): FATAL EXCEPTION: main
07-31 17:54:25.657: E/AndroidRuntime(11454): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.nsholmes.bballStats/com.nsholmes.bballStats.games.Game}: java.lang.NullPointerException
07-31 17:54:25.657: E/AndroidRuntime(11454): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970)
07-31 17:54:25.657: E/AndroidRuntime(11454): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
07-31 17:54:25.657: E/AndroidRuntime(11454): at android.app.ActivityThread.access$600(ActivityThread.java:128)
07-31 17:54:25.657: E/AndroidRuntime(11454): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
07-31 17:54:25.657: E/AndroidRuntime(11454): at android.os.Handler.dispatchMessage(Handler.java:99)
07-31 17:54:25.657: E/AndroidRuntime(11454): at android.os.Looper.loop(Looper.java:137)
07-31 17:54:25.657: E/AndroidRuntime(11454): at android.app.ActivityThread.main(ActivityThread.java:4514)
07-31 17:54:25.657: E/AndroidRuntime(11454): at java.lang.reflect.Method.invokeNative(Native Method)
07-31 17:54:25.657: E/AndroidRuntime(11454): at java.lang.reflect.Method.invoke(Method.java:511)
07-31 17:54:25.657: E/AndroidRuntime(11454): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
07-31 17:54:25.657: E/AndroidRuntime(11454): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
07-31 17:54:25.657: E/AndroidRuntime(11454): at dalvik.system.NativeStart.main(Native Method)
07-31 17:54:25.657: E/AndroidRuntime(11454): Caused by: java.lang.NullPointerException 07-31 17:54:25.657: E/AndroidRuntime(11454): at com.nsholmes.bballStats.games.Game.loadComponents(Game.java:34)
07-31 17:54:25.657: E/AndroidRuntime(11454): at com.nsholmes.bballStats.games.Game.onCreate(Game.java:27)
07-31 17:54:25.657: E/AndroidRuntime(11454): at android.app.Activity.performCreate(Activity.java:4465)
07-31 17:54:25.657: E/AndroidRuntime(11454): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
07-31 17:54:25.657: E/AndroidRuntime(11454): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
07-31 17:54:25.657: E/AndroidRuntime(11454): ... 11 more

Any help would be appreciated, Thanks THis is the full layout for the numberstepper

<TextView
    android:id="@+id/tvStepperName"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="FreeThrow"
    android:layout_weight="10" />

<Button
    android:id="@+id/btnIncrement"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="30"
    android:text="@string/plusSign" />"

<Button
    android:id="@+id/btnDecrement"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="30"
    android:text="@string/minusSign" />

<TextView
    android:id="@+id/tvStepperValue"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="2"
    android:layout_weight="30" />


</LinearLayout>

Upvotes: 1

Views: 262

Answers (2)

shri046
shri046

Reputation: 1198

Problem might be that with the way you are trying to find the view. As I understand it findViewById(..) works based off of setContentView(..) and since there is no content view set in your class the view returned is null.

Maybe you can try to find the TextView from the inflated view.

.....
private int statValue;
private View mView;

public NumberStepper(Context context, AttributeSet attrs) {
    super(context, attrs);
    //tvStepperName.setText(name);
    statValue = 0;

    LayoutInflater inflater = LayoutInflater.from(context);
    mView = inflater.inflate(R.layout.numberstepper, this);
    loadComponents();

}

private void loadComponents(){
    tvStepperName = (TextView) mView.findViewById(R.id.tvStepperName);
    tvStepperValue = (TextView) mView.findViewById(R.id.tvStepperValue);
    btnIncrement = (Button) mView.findViewById(R.id.btnIncrement);
    btnDecrement = (Button) mView.findViewById(R.id.btnDecrement);
.....
}
.....
.....

Upvotes: 1

devmiles.com
devmiles.com

Reputation: 10014

One of your findViewById calls is returning null, this could be happening on the following lines (you didn't post your full layout and code, so I'm taking a blind shot here):

ccOne = (NumberStepper)findViewById(R.id.ccOne);

tvStepperName = (TextView) findViewById(R.id.tvStepperName);

Edit:

Since now we see your full stack trace the error is on line 34 in your loadComponents function. You're calling findViewById on your NumberStepper to find R.id.tvStepperName and R.id.tvStepperValue, are you sure you have Views with these names inside your NumberStepper in layout xml?

Upvotes: 1

Related Questions