【问题标题】:Android - LinearLayout not adding custom viewAndroid - LinearLayout 不添加自定义视图
【发布时间】:2012-12-14 02:25:22
【问题描述】:

注意:由于我发现自己的愚蠢行为,此问题已得到解决

我想向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,因为我在MessageBlurb 中有一个TextView

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 本身是在activity_main.xml 文件中定义的LinearLayout。通过代码行初始化:

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

xml文件中Layout的id也叫container

有人能看出我做错了吗? 谢谢!

【问题讨论】:

  • 如果您在该行收到空指针异常,这意味着容器为空,因此您需要向我们展示它的初始化位置。否则,请通过发布完整的堆栈跟踪来澄清您的帖子。
  • 如果这是在你的 Activity 的 onCreate 覆盖中,你可能没有在这个函数的开头调用 super.onCreate(...)。当 UI 元素尚不存在时,您也可能尝试在 Activity 的构造函数中执行此操作。
  • @gsingh2011 和 Mickael 我已经编辑了我的问题。
  • 不要发布 sn-ps 代码,而是发布导致问题的完整代码体。如果该代码太大,请制作一个我们可以测试的简单工作示例。从您发布的内容中我看不出有什么问题,所以我们只能推测,直到看到整个代码。
  • @gsingh2011 我更新了我的问题

标签: java android nullpointerexception android-linearlayout viewgroup


【解决方案1】:

我不能 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 类的一部分,因此您可以并且应该将 Activity 本身作为上下文传递(即new MessageBlurb(Activity.this, results, Color.BLACK) 或类似的东西)。

希望有帮助!

【讨论】:

  • 感谢您的建议。我没有意识到带有索引的 addView 会将所有内容都向下移动。
  • +1 建议正确使用应用上下文和活动上下文。
【解决方案2】:

原来我是个彻头彻尾的白痴。我查看了我的 onCreate() 并发现我已经注释掉了这一行: setContentView(...)

即便如此,我还是要感谢所有回复此主题的人。 对不起,所有的烦恼! :)

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多