Так что я продолжаю работать в NullPointerException с проектом, который я делаю в Android Studio. Мне нужно, чтобы изображение отображалось в пользовательском классе, я вызываю DrawSurface. Я просто не могу найти ничего, что связано с моей проблемой. Я проверил различные предыдущие вопросы и просмотрел так много видео.Android SurfaceView в пользовательском классе
Ошибка Я выброшен выглядит следующим образом:
java.lang.NullPointerException в android.graphics.Canvas.throwIfCannotDraw (Canvas.java:1269) в android.graphics.Canvas.drawBitmap (Canvas .java: 1325) at edu. ########. #####. cse.treasurehunter. ###########. DrawSurface.onDraw_Original (DrawSurface.java:60) at Edu. ########. #####. cse.treasurehunter. ###########. DrawSurface.onDraw (DrawSurface.java:-1)
Мой .xml выглядит так:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="fill_parent" android:orientation="vertical" tools:context=".MainActivity">
<edu.########.####.cse.treasurehunter.###########.DrawSurface android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:id="@+id/dsField"/>
<LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="50dp">
<Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.5" android:text="View Inventory" android:id="@+id/btnInventory"/>
<Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.5" android:text="Credits" android:id="@+id/btnCredits"/>
</LinearLayout>
И мой класс DrawSurface выглядит следующим образом:
public class DrawSurface extends SurfaceView {
private Bitmap mBMPField;
private SurfaceHolder holder;
public DrawSurface(Context context) {
super(context);
holder = getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Canvas c = holder.lockCanvas();
onDraw(c);
holder.unlockCanvasAndPost(c);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
});
mBMPField = BitmapFactory.decodeResource(getResources(), R.drawable.field);
}
public DrawSurface(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DrawSurface(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.DKGRAY);
canvas.drawBitmap(mBMPField, 100, 200, null);
}
}
Итак, я очистил свое переопределение от 'onDraw()' и переименовал его. Я также хочу, чтобы статическое изображение было установлено на место, поэтому для этого изображенияView было бы достаточно? Я попытался определить «mBMPField» около вершины, но можно ли его повесить с помощью частного? Я благодарю вас за вашу помощь, я совершенно новичок в Android и Java, но я очень рад узнать. – cleverCorvid
Если вы новичок, я бы держался подальше от SurfaceView.Либо используйте пользовательский вид (см. Ссылку в ответе), либо просто файл ImageView, который специально предназначен для отображения статического растрового изображения. Ничто из этого не решает основной вопрос: 'decodeResource()' failing, и если да, то почему? Запишите возвращаемое значение и проверьте вывод logcat. – fadden
Я получаю эту ошибку от logcat: '05-10 18: 43: 40.389 2461-2583/edu. ########. Cse. ###########. Treasurehunter _ ## ######### E/Поверхность: getSlotFromBufferLocked: неизвестный буфер: 0xb4058040' – cleverCorvid