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>
Problem might be that with the way you are trying to find the view. As I understand it
findViewById(..)works based off ofsetContentView(..)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.