android - 在空对象引用上获取空指针异常虚拟方法 'long android.graphics.Paint.getNativeInstance()'

标签 android nullpointerexception android-paint

我正在尝试创建一个待办事项列表应用程序。我正在将输入的文本添加到 enter 上的列表项中,它在没有样式的情况下工作正常。 在使用 paint 添加样式并绘制后,它给出了空指针异常。我正在“ToDoListItemView”的 init 方法中初始化所有绘图和绘画对象。我尝试使用“log.i”,但它没有进入 ToDoListItemView 的 init 方法。

这是我的代码。

主要 Activity :

package todo.prac.com.todolist;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView mylistView=(ListView)findViewById(R.id.myListView);
        final EditText editText=(EditText)findViewById(R.id.myEditText);
        final ArrayList<String>todoItems=new ArrayList<String>();
        final ArrayAdapter<String>adapter;
        adapter=new ArrayAdapter<String>(this,R.layout.todolist_view,todoItems);
        mylistView.setAdapter(adapter);
        editText.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View view, int i, KeyEvent keyEvent) {
                if(keyEvent.getAction()==KeyEvent.ACTION_DOWN){
                    if(i==KeyEvent.KEYCODE_ENTER){
                        todoItems.add(0,editText.getText().toString());
                        adapter.notifyDataSetChanged();
                        editText.setText("");
                        return true;
                    }
                }
                return false;
            }
        });
    }
}

和我的 ToDoListItemView

package todo.prac.com.todolist;

import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Build;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;


    public class ToDoListItemView extends TextView {
        private Paint marginPaint;
        private Paint linePaint;
        private  int paperColor;
        private float margin;
        public ToDoListItemView(Context context) {
            super(context);
        }

        public ToDoListItemView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public ToDoListItemView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }

        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public ToDoListItemView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
        }
        private void init(){
            Log.i("init","inside");
            Resources myResources=getResources();
            marginPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
            linePaint=new Paint(Paint.ANTI_ALIAS_FLAG);
            marginPaint.setColor(myResources.getColor(R.color.notepad_margin));

            linePaint.setColor(myResources.getColor(R.color.notepad_line));
            paperColor=myResources.getColor(R.color.notepad_paper);
            margin=myResources.getDimension(R.dimen.notepad_margin);

        }
        @Override
        public void onDraw(Canvas canvas){
            canvas.drawColor(paperColor);
            if(linePaint==null){
                Log.i("linepaint","is null");
            }
            canvas.drawLine(0,0,getMeasuredHeight(),0,linePaint);
            canvas.drawLine(0,getMeasuredHeight(),getMeasuredWidth(),getMeasuredHeight(),linePaint);
            canvas.drawLine(margin,0,margin,getMeasuredHeight(),marginPaint);
            canvas.save();
            canvas.translate(margin,0);
            super.onDraw(canvas);
            canvas.restore();
        }
    }

和我的 TodoList 布局 xml:

<?xml version="1.0" encoding="utf-8"?>
<todo.prac.com.todolist.ToDoListItemView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    android:padding="10dp"
    android:scrollbars="vertical"
    android:textColor="@color/notepad_text"
    android:fadingEdge="vertical"
    />

最佳答案

您没有在类的构造函数中调用 init() 方法。

public ToDoListItemView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public ToDoListItemView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public ToDoListItemView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    init();
}

关于android - 在空对象引用上获取空指针异常虚拟方法 'long android.graphics.Paint.getNativeInstance()',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39189119/

相关文章:

android - Unity 添加 admob 插件后无法构建应用程序

android - 如何获取 'PCL' 版本的 Nodatime?

java - 尝试填充 JPanel 时图形中出现 NullPointerException

java - 使用 YOUTUBE-API 的视频路径字符串

android - 将字母间距设置为 drawTextOnPath

安卓 PathDashPathEffect : the path shape does not work for a straight line

c# - Xamarin Studio C# 尝试从按下按钮开始新 Activity

android - PreferenceActivity 与 "Settings"无关

java - 获取可选对象的字段或返回 null

android - 无法在Android中设置自定义imageview的图像资源