0

注意:この質問は、私が自分の愚かさを捕らえたために解決されました

カスタムクラスをに追加したいのですLinearLayoutが、何らかの理由で。を取得し続けNullPointerExceptionます。

加算を処理する方法は次のとおりです。

protected void onPostExecute(String results) {
        System.out.println("ON POST EXECUTE : " + results);
        try {
            if(!results.equals(((MessageBlurb)container.getChildAt(0)).getMessage())){
                try {
                    container.removeViewAt(30);
                    for (int i = 29; i > 0; i--) {
                        container.addView(container.getChildAt(i-1), i);
                        container.removeViewAt(i-1);
                    }
                    container.addView(new MessageBlurb(getApplicationContext(), results, Color.BLACK), 0);
                } catch (NullPointerException e) {
                    // TODO: handle exception
                }
            }
        }
        catch (Exception e) {
            MessageBlurb mb = new MessageBlurb(getApplicationContext(), results, Color.BLACK);
            mb.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
            System.out.println(mb);
            container.addView(mb, 0);
        }


    }

の中にあるので、ここでMessageBlurb拡張します。ViewGroupTextViewMessageBlurb

クラスは次のMessageBlurbようになります。

public MessageBlurb(Context context, String message, int color){
    super(context);
    myTV = new TextView(context);
    this.addView(myTV);
    myTV.setText(message);
    System.out.println("THE BLURB IS CREATED");
    this.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            System.out.println("YOU CLIKED THE BLURB");

        }
    });

}

の説明を印刷しましたがmb、メモリの場所がわかります。それだけでなく、logcatエラーは次の行を示しています。

container.addView(mb, 0);

それcontainer自体はファイルでLinearLayout定義されていactivity_main.xmlます。これは、次のコード行で初期化されます。

container = (LinearLayout)findViewById(R.id.container);

xmlファイルのレイアウトのIDも呼び出されますcontainer

誰かが私が間違っていることを見ることができますか?ありがとう!

4

2 に答える 2

2

これが問題の原因であるかどうかは100%わかりませんが、次のコードは問題を引き起こしているように見えます。

                container.removeViewAt(30);
                for (int i = 29; i > 0; i--) {
                    container.addView(container.getChildAt(i-1), i);
                    container.removeViewAt(i-1);
                }
                container.addView(new MessageBlurb(getApplicationContext(), results, Color.BLACK), 0);

コンテナの最後のビューを削除し、上部に新しいMessageBlurbを追加しようとしているようです。ただし、このようにすべてのビューを手動で下にシフトする必要はありません。位置0に新しいビューを追加するだけで、すべてのことができます。これに置き換えてみてください:

                container.removeViewAt(30);
                container.addView(new MessageBlurb(getApplicationContext(), results, Color.BLACK), 0);

getApplicationContext()また、メッセージの宣伝文句を作成するときに使用する正当な理由がありますか?コードは、Activityクラス内にネストされたAsyncTaskクラスの一部のように見えるため、アクティビティ自体をコンテキスト(つまりnew MessageBlurb(Activity.this, results, Color.BLACK)、類似のもの)として渡すことができます。

お役に立てば幸いです。

于 2012-12-19T22:31:08.243 に答える
0

私は完全な馬鹿だったことがわかりました。onCreate()を調べたところ、次の行をコメントアウトしていることがわかりました。 setContentView(...)

それでも、このスレッドに返信してくれたすべての人に感謝したいと思います。ご面倒をおかけしてすみません!:)

于 2012-12-20T00:43:13.537 に答える