1

2 つの TextView と 2 つのボタンを持つレイアウト/XML のカスタム コンポーネントを作成しました。そのサポート クラスでは、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;
    }

}

}

次に、これらの複合コンポーネントを 5 つまたは 6 つ含む別の XML レイアウトを作成しました。

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

このレイアウトのサポート クラス (Activity を拡張する) で、複合コンポーネント変数 setContentView() を設定し、次のことを試みます。

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

「アクティビティ ComponentInfo を開始できません」というエラーが表示されます。setLabel() を呼び出したときにのみ、このエラーが発生します。

07-31 17:54:25.657: E/AndroidRuntime(11454): 致命的な例外: メイン
07-31 17:54:25.657: E/AndroidRuntime(11454): java.lang.RuntimeException: アクティビティ ComponentInfo{com を開始できません。 nsholmes.bballStats/com.nsholmes.bballStats.games.Game}: java.lang.NullPointerException
07-31 17:54:25.657: E/AndroidRuntime(11454): android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970) )
07-31 17:54:25.657: E/AndroidRuntime(11454): android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
07-31 17:54:25.657: E/AndroidRuntime(11454): Android で.app.ActivityThread.access$600(ActivityThread.java:128)
07-31 17:54:25.657: E/AndroidRuntime(11454): android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161) で
07-31 17:54:25.657: E/AndroidRuntime(11454): android.os.Handler.dispatchMessage(Handler.java:99)
07-31 17:54:25.657: E/AndroidRuntime(11454): Android で。 os.Looper.loop(Looper.java:137)
07-31 17:54:25.657: E/AndroidRuntime(11454): android.app.ActivityThread.main(ActivityThread.java:4514)
07-31 17:54: 25.657: E/AndroidRuntime(11454): java.lang.reflect.Method.invokeNative(ネイティブ メソッド)
07-31 17:54:25.657: E/AndroidRuntime(11454): java.lang.reflect.Method.invoke( Method.java:511)
07-31 17:54:25.657: E/AndroidRuntime(11454): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
07-31 17:54: 25.657: E/AndroidRuntime (11454): com.android.internal.os.ZygoteInit.main (ZygoteInit.java:557) で
07-31 17:54:25.657: E/AndroidRuntime(11454): dalvik.system.NativeStart.main(ネイティブ メソッド)
07-31 17:54:25.657: E/AndroidRuntime(11454): 原因: java.lang .NullPointerException 07-31 17:54:25.657: E/AndroidRuntime(11454): com.nsholmes.bballStats.games.Game.loadComponents(Game.java:34)
07-31 17:54:25.657: E/AndroidRuntime( 11454): com.nsholmes.bballStats.games.Game.onCreate (Game.java:27)
07-31 17:54:25.657: E/AndroidRuntime (11454): android.app.Activity.performCreate (Activity.java で:4465)
07-31 17:54:25.657: E/AndroidRuntime(11454): android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
07-31 17:54:25.657: E/AndroidRuntime(11454): Android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1934) で
07-31 17:54:25.657: E/AndroidRuntime(11454): ... 11 詳細

これは 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>
4

2 に答える 2

1

問題は、ビューを見つけようとしている方法にある可能性があります。私が理解しているように、これはにfindViewById(..)基づいて機能setContentView(..)し、クラスにコンテンツビューが設定されていないため、返されるビューはnullになります。

たぶん、あなたは膨らんだビューからTextViewを見つけようとすることができます。

.....
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);
.....
}
.....
.....
于 2012-08-01T14:55:33.170 に答える
1

あなたのfindViewById呼び出しの 1 つが null を返しています。これは次の行で発生している可能性があります (完全なレイアウトとコードを投稿していないため、ここで盲目的に撮影しています)。

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

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

編集:

今では完全なスタック トレースが表示されているため、エラーはloadComponents関数の 34 行目にあります。NumberStepper で findViewById を呼び出して、R.id.tvStepperName と R.id.tvStepperValue を検索しています。レイアウト xmlView内にこれらの名前を持つ sがあると確信していますか?NumberStepper

于 2012-08-01T14:28:36.773 に答える