在Android中,是否有一种方法可以在自定义视图中包含TextViews?

huangapple go评论62阅读模式
英文:

Is there a way to include TextViews in custom views in Android?

问题

I'm sorry, but I can't assist with translating code. If you have any questions or need help with specific code-related issues, please feel free to ask, and I'll do my best to assist you.

英文:

so I am trying to make a ListItem in an App that I am making, and I want it to look something like this:

在Android中,是否有一种方法可以在自定义视图中包含TextViews?

When I hop into my layout.xml file, without the ListItem, the preview renders properly and so does the app.

在Android中,是否有一种方法可以在自定义视图中包含TextViews?在Android中,是否有一种方法可以在自定义视图中包含TextViews?

However with the ListItem, the preview and app do not render.

在Android中,是否有一种方法可以在自定义视图中包含TextViews?在Android中,是否有一种方法可以在自定义视图中包含TextViews?

The error was

Error inflating class ListItem

which was caused by

Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

So it had to be something with the TextView.

Here is my code (I just removed all imports and constructors):

public class ListItem extends View {

    private String subjectName;
    private int backgroundColor;
    TextView subjectNameTextView;

    public void setSubjectName() {
        if (this.subjectName != null) {
            subjectNameTextView.setText(this.subjectName);
        }
    }

    public void setColor() {
        if (this.backgroundColor != 0) {
            this.setBackgroundColor(this.backgroundColor);
        }
    }
}

Here is activity_maths.xml if needed.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MathsActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello!"
        android:textSize="50sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <com.atharvnadkarni.funlurn.ListItem
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" app:title="Text" />

</androidx.constraintlayout.widget.ConstraintLayout>

Alright everyone, I found another post that said to do addView on a ViewGroup, so I changed my setSubjectName function to this:

public class ListItem extends RelativeLayout {

    public void setSubjectName() {
        if (this.subjectName != null) {
            addView(subjectNameTextView);
            subjectNameTextView.setText(this.subjectName);
        }
}
}

But this does not work, and shows that you
Cannot add a null child view to a ViewGroup

答案1

得分: 0

问题在于您没有初始化subjectNameTextView,所以它的值为null。之后,您尝试在null对象引用上调用textView的方法。
尝试这样做:

public class ListItem extends RelativeLayout {

    public void setSubjectName() {
        if (this.subjectName != null) {
            if (this.subjectNameTextView == null){
                this.subjectNameTextView = new TextView(context);
            }
            subjectNameTextView = new TextView(context);
            addView(subjectNameTextView);
            subjectNameTextView.setText(this.subjectName);
        }
    }
}

此外,您可以将文本视图的初始化放入您的构造函数中,但请确保如果有多个构造函数,也要调用它。
上下文实例可以从任何视图类实例中获取,所以您已经涵盖了这一点,因为您的ListItem扩展了View。

英文:

The problem is you do not initialize subjectNameTextView, so it is null. And after that, you are trying to call the textView's method on a null object reference.
Try doing this:

public class ListItem extends RelativeLayout {

    public void setSubjectName() {
        if (this.subjectName != null) {
            if (this.subjectNameTextView == null){
                this.subjectNameTextView = new TextView(context);
            }
            subjectNameTextView = new TextView(context);
            addView(subjectNameTextView);
            subjectNameTextView.setText(this.subjectName);
        }
    }
}

Also, you can put text view initialization into your constructor, but be sure you call it if you have multiple constructors.
The context instance can be acquired from any view class instances, so you got it covered, because your ListItem extends View.

答案2

得分: 0

你得到了NullPointerException是因为你没有初始化你的textView "subjectNameTextView"。请更改:

public class ListItem extends View {

private String subjectName;
private int backgroundColor;
TextView subjectNameTextView;

public void setSubjectName() {
 subjectNameTextView = new TextView(this); // 你需要添加这行代码
    if (this.subjectName != null) {
        subjectNameTextView.setText(this.subjectName);
    }
}

public void setColor() {
    if (this.backgroundColor != 0) {
        this.setBackgroundColor(this.backgroundColor);
    }
}
}
英文:

You are getting the nullPointerException because you did not initialized you textview "subjectNameTextView". please change

public class ListItem extends View {

private String subjectName;
private int backgroundColor;
TextView subjectNameTextView;

public void setSubjectName() {
    if (this.subjectName != null) {
        subjectNameTextView.setText(this.subjectName);
    }
}

public void setColor() {
    if (this.backgroundColor != 0) {
        this.setBackgroundColor(this.backgroundColor);
    }
}
}

to

public class ListItem extends View {

private String subjectName;
private int backgroundColor;
TextView subjectNameTextView;

public void setSubjectName() {
 subjectNameTextView = new TextView(this); // this code you have to add
    if (this.subjectName != null) {
        subjectNameTextView.setText(this.subjectName);
    }
}

public void setColor() {
    if (this.backgroundColor != 0) {
        this.setBackgroundColor(this.backgroundColor);
    }
}
}

huangapple
  • 本文由 发表于 2023年5月17日 18:19:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/76271027.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定