注意:这个问题已经解决,原因是我遇到了自己的愚蠢问题

我想将自定义类添加到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扩展了ViewGroup,因为我在TextView内有一个MessageBlurb

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文件中Layout的ID也称为container

有人可以看到我在做什么吗?
谢谢!

最佳答案

我不是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);


另外,在创建消息blurb时,您是否有充分理由使用getApplicationContext()?您的代码看起来像是嵌套在Activity类中的AsyncTask类的一部分,因此您可以并且应该将活动本身作为上下文传递(即new MessageBlurb(Activity.this, results, Color.BLACK)或类似内容)。

希望有帮助!

08-04 01:07