Android - 调用自定义 View 方法时出现空指针异常

Posted

技术标签:

【中文标题】Android - 调用自定义 View 方法时出现空指针异常【英文标题】:Android - Getting a null pointer exception when calling custom View method 【发布时间】:2016-01-01 02:30:05 【问题描述】:

我是 android 新手,我正在尝试调用一种方法,该方法将使用画布的自定义视图绘制的圆圈向上移动 10 个像素。当我尝试调用所述方法时,我得到一个空指针异常,我不知道为什么。这是我所拥有的。

主要活动

public class CustomView extends Activity 
XView xv;

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_customview);


public void moveUp(View view)
    xv.setY(view);



自定义视图

public class XView extends View implements View.OnClickListener

private Paint mPaint = new Paint();
int oX = 200;
int oY = 200;


public XView(Context context, AttributeSet attrs)
    super(context, attrs);
    //setOnClickListener(this);




@Override
protected void onDraw(Canvas canvas) 
    super.onDraw(canvas);
    mPaint.setStyle(Paint.Style.FILL);
    mPaint.setColor(Color.MAGENTA);

    canvas.drawColor(Color.WHITE);
    canvas.drawCircle(oX, oY, 50, mPaint);

public void onClick(View view)
    oX=oX+10;
    view.postInvalidate();



public void setY(View view)

    oY=oY+10;
    view.postInvalidate();


主要活动的 XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_
android:layout_ android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".customview"
android:orientation="vertical">

<com.mycompany.customview.XView
    android:layout_
    android:layout_ />


<RelativeLayout
    android:layout_
    android:layout_>

    <Button
        android:layout_
        android:layout_
        android:layout_gravity="center_horizontal"
        android:layout_alignParentTop="true"
        android:layout_alignLeft="@+id/button2"
        android:layout_alignStart="@+id/button2"
        android:onClick="moveUp"/>

    <Button
        android:layout_
        android:layout_
        android:layout_gravity="right"
        android:layout_alignTop="@+id/button2"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <Button
        android:layout_
        android:layout_
        android:layout_alignTop="@+id/button"
        android:layout_centerHorizontal="true"
        android:id="@+id/button2" />

    <Button
        android:layout_
        android:layout_
        android:layout_gravity="center_horizontal"
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:id="@+id/button" />
    <Button
        android:layout_
        android:layout_
        android:layout_gravity="center_horizontal"
        android:id="@+id/button5"
        android:layout_alignParentBottom="true"
        android:layout_alignLeft="@+id/button2"
        android:layout_alignStart="@+id/button2" />
</RelativeLayout>

谢谢

【问题讨论】:

【参考方案1】:

您需要在您的 xml 中为您的自定义视图添加一个 id:

  <com.mycompany.customview.XView
    android:id="@+id/xvview_id"
    android:layout_
    android:layout_ />

并使用findViewById 初始化您的成员

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_customview);
    xv = (XView) findViewById(R.id.xvview_id);

当您调用setContentView 时,Android 会“添加”您在布局中声明为 Activity 视图层次结构的一部分的小部件,使它们在当前 Activity 的上下文中可供您使用。你所要做的就是调用findViewById 来获取你想要使用的小部件的引用

【讨论】:

如果自定义视图全部通过代码添加,但布局 XML 中不存在怎么办?

以上是关于Android - 调用自定义 View 方法时出现空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

Android 必知必会:自定义 View 可以知道 onPause/onResume 被调用了吗?

Android 必知必会:自定义 View 可以知道 onPause/onResume 被调用了吗?

Android自定义View(三深入解析控件测量onMeasure)

Android自定义圆角矩形进度条2

Android 必知必会:自定义 View 可以知道 onPauseonResume 被调用了吗?(不依赖Lifecycle)

Android 必知必会:自定义 View 可以知道 onPause/onResume 被调用了吗?(不依赖Lifecycle)