java - Android - LinearLayout不添加自定义 View

标签 java android nullpointerexception android-linearlayout viewgroup

注意:由于我发现了自己的愚蠢,这个问题已得到解决

我想将自定义类添加到 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);

容器本身是在activity_main.xml文件中定义的LinearLayout。它是通过以下代码行初始化的:

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

看起来您正在尝试删除容器中的最后一个 View 并在顶部添加一个新的 MessageBlurb。但您不需要像这样手动将所有 View 向下移动,只需在位置 0 添加一个新 View 即可为您完成所有这些操作。尝试用这个替换它:

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

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

希望有帮助!

关于java - Android - LinearLayout不添加自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13871803/

相关文章:

java - 为什么 JNIOnLoad 没有运行?

java - 编辑JavaFX SceneBuilder的示例数据

android - 如何检查我的 RecycleView notifyDataSetChanged() 何时完成?

具有新数据绑定(bind)导入的 Android Studio 3.2.1 无法编译

java - 使用 TestNG 运行代码时出现空指针异常

java - 编译器 asm 字节码表达式

java - SWT/JFace 还是 Eclipse RCP?

android - 操作栏颜色不会随着 AppCompat v7 :21 而改变

Android 操作栏微调器选择的项目、副标题和下拉列表

java.util.Properties$LineReader.readLine 处的 java.lang.NullPointerException