将数据传递到自定义视图
Passing data to custom view
我想将数据传递到我的自定义视图,一个列表。它有效,但由于某些原因,我现在得到一个 Nullpointer 异常,我不知道为什么。
我通过构造函数传递数据,但列表大小始终为零,但是当我尝试在构造函数中获取列表大小时,我得到了正确的大小,但在它之外始终为 0。
MainActivity.java
LineChart2 lineChart2;
List<items> items = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
items.add(new items(R.color.babyBlau,10,"Internet"));
items.add(new items(R.color.colorAccent,20,"Internet"));
items.add(new items(R.color.rot,60,"Internet"));
lineChart2 = new LineChart2(MainActivity.this,items);
}
LineChart2.java
包裹 com.example.viewtest;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
public class LineChart2 extends View {
List<items> items = new ArrayList<>();
Paint paintThinBlackLine;
Paint paintThinGrayLines;
Paint paintText;
float padding = 50;
float padding_left = padding * 3;
float padding_text = padding_left/2;
public LineChart2(Context context, List<com.example.viewtest.items> items) {
super(context);
this.items = items;
initPaints();
}
public LineChart2(Context context, AttributeSet attrs) {
super(context, attrs);
initPaints();
}
public LineChart2(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initPaints();
}
public LineChart2(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initPaints();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(width,width/2);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// thin lines
for(int i = 1; i < 7; i++){
float paddingbetween = (getHeight()-padding-padding)/6;
canvas.drawLine(padding_left,paddingbetween*i,getWidth()-padding,paddingbetween*i,paintThinGrayLines);
Log.d("HALLO",""+items.size());
//canvas.drawText(String.valueOf(items.get(i).value),padding_text,paddingbetween*i,paintText);
}
}
public void initPaints(){
paintThinBlackLine = new Paint();
paintThinBlackLine.setColor(Color.parseColor("#6FB4B3B3"));
paintThinBlackLine.setStyle(Paint.Style.STROKE);
paintThinBlackLine.setStrokeCap(Paint.Cap.ROUND);
paintThinBlackLine.setStrokeWidth(3);
paintThinGrayLines = new Paint();
paintThinGrayLines.setColor(Color.parseColor("#6FB4B3B3"));
paintThinGrayLines.setStyle(Paint.Style.STROKE);
paintThinGrayLines.setStrokeCap(Paint.Cap.ROUND);
paintThinGrayLines.setStrokeWidth(2);
paintText = new Paint();
paintText.setTextSize(20);
paintText.setColor(Color.parseColor("#FF696969"));
paintText.setTextAlign(Paint.Align.CENTER);
}
}
我已经编译了你的代码并且运行良好。产生问题的唯一原因是在设置数据之前将布局附加到它的容器。
最好从下面的代码中添加您的布局。
LinearLayout anyDesiredLayout= findViewById(R.id.layout);
items.add(new items(R.color.colorAccent, 10, "Internet"));
items.add(new items(R.color.colorAccent, 20, "Internet"));
items.add(new items(R.color.colorAccent, 60, "Internet"));
LineChart2 lineChart2 = new LineChart2(this, items);
anyDesiredLayout.addView(lineChart2);
编辑
问题是您正在创建两个视图
此行 new LineChart2(this, items);
将创建新视图,该视图与您在 xml 中附加的视图不同。
在 lineChart2
的情况下,您可以看到 items
已在 lineChart2
构造函数中正确设置。但是 onDraw
尚未被调用,因为您没有将视图附加到任何容器。
并且您的 xml onDraw
方法中的视图将被调用,但您会发现 items
列表为空。因为 LineChart2(Context context, List<items> items)
从未被调用过。
我想将数据传递到我的自定义视图,一个列表。它有效,但由于某些原因,我现在得到一个 Nullpointer 异常,我不知道为什么。
我通过构造函数传递数据,但列表大小始终为零,但是当我尝试在构造函数中获取列表大小时,我得到了正确的大小,但在它之外始终为 0。
MainActivity.java
LineChart2 lineChart2;
List<items> items = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
items.add(new items(R.color.babyBlau,10,"Internet"));
items.add(new items(R.color.colorAccent,20,"Internet"));
items.add(new items(R.color.rot,60,"Internet"));
lineChart2 = new LineChart2(MainActivity.this,items);
}
LineChart2.java 包裹 com.example.viewtest;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
public class LineChart2 extends View {
List<items> items = new ArrayList<>();
Paint paintThinBlackLine;
Paint paintThinGrayLines;
Paint paintText;
float padding = 50;
float padding_left = padding * 3;
float padding_text = padding_left/2;
public LineChart2(Context context, List<com.example.viewtest.items> items) {
super(context);
this.items = items;
initPaints();
}
public LineChart2(Context context, AttributeSet attrs) {
super(context, attrs);
initPaints();
}
public LineChart2(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initPaints();
}
public LineChart2(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initPaints();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(width,width/2);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// thin lines
for(int i = 1; i < 7; i++){
float paddingbetween = (getHeight()-padding-padding)/6;
canvas.drawLine(padding_left,paddingbetween*i,getWidth()-padding,paddingbetween*i,paintThinGrayLines);
Log.d("HALLO",""+items.size());
//canvas.drawText(String.valueOf(items.get(i).value),padding_text,paddingbetween*i,paintText);
}
}
public void initPaints(){
paintThinBlackLine = new Paint();
paintThinBlackLine.setColor(Color.parseColor("#6FB4B3B3"));
paintThinBlackLine.setStyle(Paint.Style.STROKE);
paintThinBlackLine.setStrokeCap(Paint.Cap.ROUND);
paintThinBlackLine.setStrokeWidth(3);
paintThinGrayLines = new Paint();
paintThinGrayLines.setColor(Color.parseColor("#6FB4B3B3"));
paintThinGrayLines.setStyle(Paint.Style.STROKE);
paintThinGrayLines.setStrokeCap(Paint.Cap.ROUND);
paintThinGrayLines.setStrokeWidth(2);
paintText = new Paint();
paintText.setTextSize(20);
paintText.setColor(Color.parseColor("#FF696969"));
paintText.setTextAlign(Paint.Align.CENTER);
}
}
我已经编译了你的代码并且运行良好。产生问题的唯一原因是在设置数据之前将布局附加到它的容器。
最好从下面的代码中添加您的布局。
LinearLayout anyDesiredLayout= findViewById(R.id.layout);
items.add(new items(R.color.colorAccent, 10, "Internet"));
items.add(new items(R.color.colorAccent, 20, "Internet"));
items.add(new items(R.color.colorAccent, 60, "Internet"));
LineChart2 lineChart2 = new LineChart2(this, items);
anyDesiredLayout.addView(lineChart2);
编辑
问题是您正在创建两个视图
此行 new LineChart2(this, items);
将创建新视图,该视图与您在 xml 中附加的视图不同。
在 lineChart2
的情况下,您可以看到 items
已在 lineChart2
构造函数中正确设置。但是 onDraw
尚未被调用,因为您没有将视图附加到任何容器。
并且您的 xml onDraw
方法中的视图将被调用,但您会发现 items
列表为空。因为 LineChart2(Context context, List<items> items)
从未被调用过。