Android: Cum se creează o vizualizare folosind panza, apoi utilizați această vizualizare în activitate

Trebuie să folosesc o clasă de panza pentru a adăuga cadre și mai multe imagini pe ea. dar problema mea este că trebuie să utilizez vizualizarea pânzei în clasa mea de activitate. Vreau să folosesc această vizualizare a panzei ca un widget pentru a putea să o folosesc în XML-ul meu.

Am încercat acest lucru folosind acest cod:

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();
    }
}

și l-am folosit în clasa mea xml așa:

<?xml version="1.0" encoding="utf-8"?>

        
        

și îl accesez în clasa mea de activitate, astfel:

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

problema mea este că atunci când încerc să apel funcția setImage() din clasa mea de activitate aceasta arată excepția pointerului nul. Ce trebuie să fac pentru a adăuga imagini în vizualizarea canvas folosind clasa mea de activitate. Nu vreau să folosesc setContentView deoarece aceasta va face ca numai Canvas View să se afișeze în activitatea mea.

Ieșire 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 is my activity from where I'm calling SetImage method.

3
LogCat postat. newImg este o trasabilă. Practic, vreau doar să desenez o imagine pe panza mea prin clasa mea de activitate.
adăugat autor Vipul Purohit, sursa
Care este atributul newImg în metoda setImage() !! posta logcat-ul tau!
adăugat autor K_Anas, sursa

4 răspunsuri

Mi-am spus punctul de vedere din altă activitate și de aceea am primit NullPointerException. Dar acum o numesc de la aceeași activitate și de la finele ei.

1
adăugat

Îți lipsește R.id.twoDee1 și/sau setContentView() .

Add an id to your layout of com.yourapphere.TwoDee

<?xml version="1.0" encoding="utf-8"?>

        
        

Apoi faceți în onCreate :

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

Actualizați:

Trebuie trebuie să sunați setContentView ! Nu am nici o idee de ce nu ar trebui să "acoperi pânza completă" (ceea ce înseamnă că ...)

1
adăugat
Îmi pare rău că am uitat să scriu id în întrebarea mea. Am încercat asta. dar nu funcționează.
adăugat autor Vipul Purohit, sursa
Vreau să utilizez această vizualizare cu celelalte vizualizări ale mele, cum ar fi vizualizarea textului și altele. Dacă folosesc setContentView (), atunci activitatea mea va afișa numai vizualizarea Canvas. și aspectul meu este prea complex pentru a crea programabil.
adăugat autor Vipul Purohit, sursa
mi-a actualizat răspunsul
adăugat autor WarrenFaith, sursa
Nu aveți altă soluție, apoi apelați setContentView() cu ceea ce vreți vreodată. Deci, trebuie doar să adăugați modelul TwoDee la aspectul dvs. și să apelați setContentView. Asta e tot ce ai nevoie.
adăugat autor WarrenFaith, sursa
mulțumesc @downvoter pentru că ați comentat de ce ați votat-o!
adăugat autor WarrenFaith, sursa

Vedeți cu atenție codul


Nu ați scris atribut id.Aceasta ar trebui să fie


0
adăugat
Mi-am actualizat întrebarea. Am încercat asta. dar nu funcționează
adăugat autor Vipul Purohit, sursa

Este gresit.

I dont want to use setContentView because this will make only Canvas View to show in my activity.

Până și cu excepția cazului în care nu specificați setContentView cum va ști Android de la care fișier de control ar trebui să fie preluat.

De exemplu

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

findViewById va funcționa numai în cazul în care specificați fișierul de aspect în setContentView.

0
adăugat
Am specificat aspectul meu:
adăugat autor Vipul Purohit, sursa
Vă mulțumim că ați arătat :)
adăugat autor Vipul Shah, sursa
@VipulShah vă rog nu să răspundeți de două ori la o întrebare. Actualizați și modificați un răspuns dacă este necesar
adăugat autor WarrenFaith, sursa
Android dezvoltatori, România — Moldova
Android dezvoltatori, România — Moldova
27 participanți

Parteneri: ciupacabra.com, @php_ro, @js_ro, @node_ro iOS: @ro_ios Reguli: https://github.com/js-ro/it-telegram/blob/master/RULES.md