3

フレームと複数の画像を追加するには、キャンバス クラスを使用する必要があります。しかし、私の問題は、アクティビティ クラスでキャンバス ビューを使用する必要があることです。XML で使用できるように、このキャンバス ビューをウィジェットとして使用したいと考えています。

このコードを使用してこれを試しました:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.View;

public class TwoDee extends View {
    private int mWidth;
    private int mHeight;


    public TwoDee(Context context) {
        super(context);
    }

    public TwoDee(Context context, AttributeSet attribs) {
        super(context, attribs);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint(); 
        paint.setColor(Color.GRAY); 
        paint.setStyle(Style.FILL); 
        canvas.drawPaint(paint);

        paint.setColor(Color.BLUE);
        canvas.drawLine(0, 0, mWidth, mHeight, paint);
        canvas.drawLine(mWidth, 0, 0, mHeight, paint);

        paint.setColor(Color.RED);
        canvas.drawText("0 kal", 50, 85, paint);
        canvas.save();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        mWidth = View.MeasureSpec.getSize(widthMeasureSpec);
        mHeight = View.MeasureSpec.getSize(heightMeasureSpec);
        setMeasuredDimension(mWidth, mHeight);
    }

    public void setImage(Drawable myImg) {
        newImg = myImg;
        invalidate();
    }
}

次のように私のxmlクラスで使用しました:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
        <TextView  
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content" 
            android:text="@string/hello"
        />
        <com.yourapphere.TwoDee
            android:id="@+id/twoDee1"
            android:layout_width="150dp"
            android:layout_height="100dp"
        />
</LinearLayout>

そして、私は次のように私のアクティビティクラスでそれにアクセスしています:

TwoDee myCanvas;
myCanvas = (TwoDee)findViewById(R.id.twoDee1);
myCanvas.setImage(drawable);

私の問題は、アクティビティ クラスから setImage() 関数を呼び出そうとすると、null ポインター例外が表示されることです。Activity クラスを使用してキャンバス ビューに画像を追加するにはどうすればよいですか。setContentViewこれにより、キャンバスビューのみがアクティビティに表示されるため、使用したくありません。

LogCat 出力:

FATAL EXCEPTION: main
java.lang.NullPointerException
at iTagz.android.Dialog_ImagePreview$1.onClick(Dialog_ImagePreview.java:84)
at android.view.View.performClick(View.java:2485)
at android.view.View$PerformClick.run(View.java:9081)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3770)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:880)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:638)
at dalvik.system.NativeStart.main(Native Method)

Dialog_ImagePreviewは、SetImageメソッドを呼び出している場所からのアクティビティです。

4

4 に答える 4

1

私は他のアクティビティから自分のビューを呼び出していたので、NullPointerException を取得していました。しかし、今は同じアクティビティから呼び出しており、正常に動作しています。

于 2012-06-04T05:26:07.927 に答える
0

コードを注意深く見てください

<com.yourapphere.TwoDee
            android:layout_width="150dp"
            android:layout_height="100dp"
        />

id 属性が記述されていません。

<com.yourapphere.TwoDee
            android:id=@+id/twoDee1"
            android:layout_width="150dp"
            android:layout_height="100dp"
        />
于 2012-06-01T12:49:06.390 に答える
0

これは間違っています。

アクティビティに表示されるのはキャンバス ビューのみになるため、setContentView は使用したくありません。

setContentView を指定しない限り、どのレイアウト ファイル コントロールからフェッチする必要があるかを Android がどのように認識するか。

例えば

TwoDee myCanvas = (TwoDee) findViewById(R.id.twoDee1);

findViewById は、setContentView 内でレイアウト ファイルを指定した場合にのみ機能します。

于 2012-06-01T13:03:24.763 に答える
-1

R.id.twoDee1および/またはがありませんsetContentView()

のレイアウトに ID を追加しますcom.yourapphere.TwoDee

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
        <TextView  
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content" 
            android:text="@string/hello"
        />
        <com.yourapphere.TwoDee
            android:id="@+id/twoDee1"
            android:layout_width="150dp"
            android:layout_height="100dp"
        />
</LinearLayout>

次に、次のことを行いonCreateます。

setContentView(R.layout.yourxmlfile);
TwoDee myCanvas = (TwoDee) findViewById(R.id.twoDee1);
myCanvas.setImage(drawable);

アップデート:

あなた電話する必要がありますsetContentView!「完全なキャンバスをカバー」したくない理由がわかりません(それが何を意味するのか...)

于 2012-06-01T12:36:30.080 に答える