【问题标题】:Cannot getText Because of wrong Id由于 ID 错误,无法获取文本
【发布时间】:2018-01-23 06:51:21
【问题描述】:

我一直在尝试解决这个问题,但似乎没有用。我在下面的代码块中的这一行 school.setClasses(classesName.getText().toString()); 上得到了一个 nullPointer 异常。

哪些是实际发布到 SQLite 数据库的代码

 public void postSchoolSetuptoSQLite() {

        school.setSchoolName(nameOfSchool.getText().toString());
        school.setSchoolLocation(schoolLocation.getText().toString());
        school.setClasses(classesName.getText().toString());
        academeaSQL.addSchool(school);

        if (demeaSQL != null) {
            StringBuilder sb = new StringBuilder();
            for (School s : demeaSQL.getAllSchools()) {
                sb.append(" SchoolName= " + s.getSchoolName() + " SchoolLocation= " + s.getSchoolLocation()
                        + " ClassName= " + s.getClasses());
                sb.append("\n");
            }
            Log.i("Database content", sb.toString());

            Toast.makeText(getApplicationContext(), "Added Successfully", Toast.LENGTH_LONG).show();

        } else {
            Log.i("Database Err", "Database Error");
        }



    }

我正在通过此 onAddField 方法单击“添加新类”按钮为 classesName 动态创建字段

public void onAddField(View v) {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

         rowView = inflater.inflate(R.layout.field, null);

        rowView.setId(ViewIdGenerator.generateViewId());


        // Add the new row before the add field button.
        parentLinearLayout.addView(rowView, parentLinearLayout.getChildCount() - 1);

        Log.i("ids", String.valueOf(rowView.getId()));
    }

字段Id是通过ViewIdGenerator类动态生成的。

此时的错误是classesName = rowView.findViewById(rowView.getId()); 从该代码块中动态创建的字段中获取 Id 时

public void findByIds() {

        rowView = new View(this);

        parentLinearLayout = findViewById(R.id.parent_linear_layout);

        nameOfSchool = findViewById(R.id.nameOfSchool);

        schoolLocation = findViewById(R.id.schoolLocation);

        addSchoolAndMoveNext = findViewById(R.id.addSchoolAndMoveNext);


            classesName = rowView.findViewById(rowView.getId());

            Log.i("Classname", String.valueOf(classesName));
            Log.i("SchoolLoca", String.valueOf(schoolLocation));

    }

这是我打电话给findByIds();的地方

 @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_school_search_setup);

        findByIds();
        intitializeListeners();
        initializeObjects();





    }

对于 Nullpointer 异常。错误指向这些区域

school.setClasses(classesName.getText().toString());

classesName = rowView.findViewById(rowView.getId());

请问为什么我会收到空​​指针异常以及如何解决它。谢谢你。非常感谢您的回复。

【问题讨论】:

  • 你在哪里/何时打电话给findByIds()
  • 您说错误出现在两个不同的地方...是哪一个? NullPointerExceptions 也很容易解决,尤其是使用调试器。如果掌握了这个强大的工具,你就不需要我们的帮助了。
  • 尝试实现这样的东西。 stackoverflow.com/questions/45017297/…
  • 好的@Rafa谢谢你的回复我真的很感激你和你一样我在默认的oncreate方法上调用findByIds。让我编辑问题以显示通话。
  • @Sam 这里的错误在“school.setClasses(classesName.getText().toString());”行中和'classesName = rowView.findViewById(rowView.getId());'我将编辑我的问题以明确这一点

标签: java android xml dynamic


【解决方案1】:

您的问题是,如果您在onCreate() 内部调用findByIds(),那么rowView.getId() 将返回null,因为您在按下按钮后在默认id 生成器中设置了id。 onCreate() 在 Activity 首次启动时被调用。

当您点击按钮时,您似乎也在尝试添加一个类列表。在 Android 中有内置的方法可以做到这一点,它们的开销比你正在做的要多(就实现所需的时间而言),但对于滚动、添加新类、删除类、等等

查看recyclerview 以执行此操作

在 RecyclerView 部分中的 Display Cursor 内容here 将向您展示如何将数据从数据库添加到 RecyclerView

【讨论】:

  • 好的。著名的。但是每次单击按钮时,每个学校班级都会一次添加一个,回收视图是否也会处理这个问题?
  • 我已经编辑了我的答案并链接到一个方便的资源,该资源有一个关于如何做到这一点的示例。如果您遇到卡住时对具体实现有更多疑问,请打开另一个带有具体细节的问题:)
  • 我无法再提出新问题,因为我已被阻止进一步提问。同时,非常感谢您的宝贵时间,您真的很有帮助,我很感激。
  • 很抱歉听到 :( 我认为接受答案有助于解决这个问题,因为这意味着提出可回答的问题。
猜你喜欢
  • 2020-07-22
  • 2020-07-18
  • 2019-12-15
  • 2022-11-21
  • 2020-12-11
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
相关资源
最近更新 更多