0

この SnowFall プロジェクトを試しています。http://code.google.com/p/android-30days-apps/source/browse/trunk/08day/src/com/bakhtiyor/android/snowfall/SnowFall.java?r=27

そして、TextView を View クラス (クラス SnowFallView extends View、42 行目) 内に配置する必要があります。

TextView をインスタンス化して、このように追加できますか?

 package in.isuru.animate;



 public class SnowFall extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            SnowFallView snowFallView = new SnowFallView(this);
            setContentView(snowFallView);
            snowFallView.setBackgroundDrawable(getResources().getDrawable(R.drawable.background_image));

    }

    private class SnowFallView extends View {
            private int snow_flake_count = 5;
            private final List<Drawable> drawables = new ArrayList<Drawable>();
            private int[][] coords;
            private final Drawable snow_flake;
            private TextView countDownView;

            public SnowFallView(Context context) {
                    super(context);
                    setFocusable(true);
                    setFocusableInTouchMode(true);

                    snow_flake = context.getResources().getDrawable(R.drawable.snow_flake);
                    snow_flake.setBounds(0, 0, snow_flake.getIntrinsicWidth(), snow_flake
                            .getIntrinsicHeight());

                    countDownView = new TextView(context);
                    countDownView.setText("It's working");
                    addContentView(countDownView, null);

                    //LayoutInflater inflater = getLayoutInflater();
                    //getWindow().addContentView(inflater.inflate(R.layout.text_layout, null), new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
                    //ViewGroup.LayoutParams.FILL_PARENT));
            }

            @Override
            protected void onSizeChanged(int width, int height, int oldw, int oldh) {
                    super.onSizeChanged(width, height, oldw, oldh);
                    Random random = new Random();
                    Interpolator interpolator = new LinearInterpolator();

                    snow_flake_count = Math.max(width, height) / 20;
                    coords = new int[snow_flake_count][];
                    drawables.clear();
                    for (int i = 0; i < snow_flake_count; i++) {
                            Animation animation = new TranslateAnimation(0, height / 10
                                    - random.nextInt(height / 5), 0, height + 30);
                            animation.setDuration(10 * height + random.nextInt(5 * height));
                            animation.setRepeatCount(-1);
                            animation.initialize(10, 10, 10, 10);
                            animation.setInterpolator(interpolator);

                            coords[i] = new int[] { random.nextInt(width - 30), -30 };

                            drawables.add(new AnimateDrawable(snow_flake, animation));
                            animation.setStartOffset(random.nextInt(20 * height));
                            animation.startNow();
                    }
            }

            @Override
            protected void onDraw(Canvas canvas) {
                    for (int i = 0; i < snow_flake_count; i++) {
                            Drawable drawable = drawables.get(i);
                            canvas.save();
                            canvas.translate(coords[i][0], coords[i][1]);
                            drawable.draw(canvas);
                            canvas.restore();
                    }
                    invalidate();
            }

    } 
}

しかし、これを行うとエラーが発生します。

06-04 00:22:22.364: E/AndroidRuntime(359): java.lang.RuntimeException: アクティビティ ComponentInfo{in.isuru.animate/in.isuru.animate.SnowFall} を開始できません: java.lang.NullPointerException

PS。すべてのインポートが完了しました。

4

3 に答える 3

0
countDownView = new TextView(context);
countDownView.setText("It's working");
addContentView(countDownView, null);

あなたの問題はここにあると思います:

addContentView(countDownView, null);

あなたが使用する必要があります

addView(countDownView)

それ以外のaddContentView

于 2012-06-03T19:03:10.930 に答える
0

TextViewはい、実行時にそのように追加できます。これは、MyClassサブクラスandroid.content.Context. 質問の 2 番目の部分でどのレイアウトについて尋ねているのかわかりません。コンテナー レイアウト (linearLayout) は既にあります。

于 2012-06-03T18:38:01.147 に答える
0

これが100%正しいかどうかはわかりませんが、このようなことをする必要があります...

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout linearLayout = new LinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    SnowFallView snowFallView = new SnowFallView(this);
    TextView txt1 = new TextView(this);
    linearLayout.addView(snowFallView);
    linearLayout.addView(txt1);
    setContentView(linearLayout);
    snowFallView.setBackgroundDrawable(getResources().getDrawable(R.drawable.background_image));
}

SnowFallViewこれらの行もクラスから削除します。

countDownView = new TextView(context);
countDownView.setText("It's working");
addContentView(countDownView, null);
于 2012-06-03T19:20:24.263 に答える