Java 如何将字符串值动态传递给另一个类中的textview?

Java 如何将字符串值动态传递给另一个类中的textview?,java,android,Java,Android,我的代码: 根据格雷厄姆的评论进行编辑 PaintView.java public class PaintView extends View { private Bitmap mBitmap; private Canvas mCanvas; private Path mPath; private Paint mPaint; private static final int TOUCH_TOLERANCE_DP = 20; private static final int BACKGROUND

我的代码:

根据格雷厄姆的评论进行编辑

PaintView.java

public class PaintView extends View {

private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private Paint mPaint;
private static final int TOUCH_TOLERANCE_DP = 20;
private static final int BACKGROUND = 0xFFDDDDDD;
private List<Point> mPoints = new ArrayList<Point>();
private int mLastPointIndex = 0;
private int marks = 0;
private int mTouchTolerance;
private boolean isPathStarted = false;

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawColor(BACKGROUND);
    canvas.drawBitmap(mBitmap, 0, 0, null);
    canvas.drawPath(mPath, mPaint);

    // TODO remove if you dont want points to be drawn
    for (Point point : mPoints) {
        canvas.drawPoint(point.x, point.y, mPaint);
    }
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            touch_start(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_MOVE:
            touch_move(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            touch_up(x, y);
            invalidate();
            break;
    }
    return true;
}

private void touch_start(float x, float y) {

    if (checkPoint(x, y, mLastPointIndex)) {
        mPath.reset();
        // user starts from given point so path can beis started
        isPathStarted = true;
    } else {
        // user starts move from point which doen's belongs to mPinst list
        isPathStarted = false;
    }

}

//ADDED WITH LAST EDIT
private void touch_move(float x, float y) {
    // draw line with finger move
    if (isPathStarted) {
        mPath.reset();
        Point p = mPoints.get(mLastPointIndex);
        mPath.moveTo(p.x, p.y);
        if (checkPoint(x, y, mLastPointIndex + 1)) {
            p = mPoints.get(mLastPointIndex + 1);
            mPath.lineTo(p.x, p.y);
            mCanvas.drawPath(mPath, mPaint);
            mPath.reset();
            ++mLastPointIndex;
            marks++;
            update();
        } else {
            mPath.lineTo(x, y);
        }
    }
}

private void update() {
    // TODO Auto-generated method stub
    String newMarks  = "";
    newMarks = Integer.toString(marks);
    Log.e("Marks", ":" + newMarks);
}

/**
 * Draws line.
 */
private void touch_up(float x, float y) {
    mPath.reset();
    marks--;
    update();
    if (checkPoint(x, y, mLastPointIndex + 1) && isPathStarted) {
        // move finished at valid point so draw whole line

        // start point
        Point p = mPoints.get(mLastPointIndex);
        mPath.moveTo(p.x, p.y);
        // end point
        p = mPoints.get(mLastPointIndex + 1);
        mPath.lineTo(p.x, p.y);
        mCanvas.drawPath(mPath, mPaint);
        mPath.reset();
        // increment point index
        ++mLastPointIndex;
        isPathStarted = false;
    }

}
}

我想从PaintView.java获取marks的值,并将该值分配给MainActivity.java中的textView。这是一个noob问题,但请帮我解决这个问题。

你可以使用观察者模式来解决这个问题

observer活动.java

这是您的观察员有多个观察员

public class ObserverActivity extends Activity  implements Observer{
    com.talha.examples.PaintView paint1;
    private ActivityHolder paintHolder = ActivityHolder.getInstance();
    EditText editText1;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_paintview);        
        paint1= (com.talha.examples.PaintView)findViewById(R.id.paint1);
        editText1= (EditText)findViewById(R.id.editText1);
        paintHolder.registerObserver(this);

    }

    @Override
    public void updateNewValue(String str) {        
        editText1.setText(str);
    }
}
Observer.java 您的所有观察者都必须实现这一点

public interface Observer {
    public void updateNewValue(String str); 
}
Subject.java

public interface Subject {
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObserver();
}
ActivityHolder.java

public interface Subject {
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObserver();
}
这个类将使用单例在列表中保存观察者,然后您可以调用所有观察者来通知数据已更改

  import java.util.ArrayList;

public class ActivityHolder implements Subject {
    private static ActivityHolder uniqueActivityHolder;
    private ArrayList observers;
    private String newValue; 

    private ActivityHolder() {
        observers = new ArrayList();
    }

    public static synchronized ActivityHolder getInstance() {
        if (uniqueActivityHolder == null) {
            uniqueActivityHolder = new ActivityHolder();
        }
        return uniqueActivityHolder;
    }

    public void registerObserver(Observer o) {
        observers.add(o);
    }

    public void removeObserver(Observer o) {
        int i = observers.indexOf(o);
        if (i >= 0) {
            observers.remove(i);
        }

    }

    public void notifyObserver() {
        for (int i = 0; i < observers.size(); i++) {
            Observer observer = (Observer) observers.get(i);
            observer.updateNewValue(newValue);
        }
    }

    public void valueChanged() {
        notifyObserver();
    }

    public void setNewValue(String _NewValue) {
        this.newValue = _NewValue;
        valueChanged();
    }
}
import java.util.ArrayList;
公共类活动持有者实现主题{
私人静态活动持有人唯一活动持有人;
私人ArrayList观察员;
私有字符串newValue;
私人活动持有人(){
Observators=新的ArrayList();
}
公共静态同步ActivityHolder getInstance(){
if(uniqueActivityHolder==null){
uniqueActivityHolder=新ActivityHolder();
}
返回uniqueActivityHolder;
}
公共无效注册表观察者(o){
观察员:添加(o);
}
公共无效移除观察员(观察员o){
int i=观察者。indexOf(o);
如果(i>=0){
观察员:删除(i);
}
}
公众观察者(){
对于(int i=0;i
PaintView.java

绘制视图数据获取保存观察者列表的ActivityHolder唯一实例,然后它将通知代码下面的所有观察者

对于(int i=0;i
import java.util.ArrayList;
导入java.util.List;
导入android.content.Context;
导入android.content.res.Resources;
导入android.graphics.Bitmap;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.Paint;
导入android.graphics.Path;
导入android.graphics.Point;
导入android.util.AttributeSet;
导入android.util.Log;
导入android.util.TypedValue;
导入android.view.MotionEvent;
导入android.view.view;
公共类PaintView扩展了视图{
私有位图mBitmap;
私人帆布mCanvas;
专用路径mPath;
私人油漆;
专用静态最终内部接触公差DP=20;
私有静态final int BACKGROUND=0xFFDDDD;
私有列表mPoints=new ArrayList();
私有int mLastPointIndex=0;
私人整数分数=0;
私人国际旅行社;
私有布尔值isPathStarted=false;
私有ActivityHolder paintHolder=ActivityHolder.getInstance();
公共PaintView(上下文){
超级(上下文);
mCanvas=新画布();
mPath=新路径();
mPaint=新油漆();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(Color.BLACK);
mPaint.setStyle(油漆、样式、笔划);
mPaint.setStrokeJoin(油漆.连接.圆形);
mPaint.setStrokeCap(油漆盖圆形);
mPaint.设定行程宽度(12);
MTOUCHTOURANCE=dp2px(接触公差DP);
//TODO只是测试点
点p1=新点(133123);
点p2=新点(149136);
点p3=新点(182,137);
点p4=新点(206118);
点p5=新点(208,87);
p6点=新点(187,71);
p7点=新点(144,78);
p8点=新点(124101);
点p9=新点(113,128);
点p10=新点(112157);
点p11=新点(119188);
点p12=新点(134209);
点p13=新点(162228);
点p14=新点(194238);
点p15=新点(232,240);
点p16=新点(263237);
点p17=新点(289224);
点p18=新点(315204);
点p19=新点(332174);
点p20=新点(339128);
点p21=新点(329,95);
点p22=新点(304,73);
点p23=新点(280,69);
点p24=新点(254,87);
点p25=新点(248116);
点p26=新点(259143);
点p27=新点(278153);
点p28=新点(241157);
点p29=新点(192160);
点p30=新点(150159);
mPoints.add(p1);
mPoints.add(p2);
mPoints.add(p3);
mPoints.add(p4);
mPoints.add(p5);
mPoints.add(第6页);
mPoints.add(第7页);
mPoints.add(第8页);
mPoints.add(第9页);
mPoints.add(第10页);
mPoints.add(第11页);
mPoints.add(第12页);
mPoints.add(第13页);
mPoints.add(第14页);
mPoints.add(第15页);
mPoints.add(第16页);
mPoints.add(第17页);
mPoints.add(第18页);
mPoints.add(第19页);
mPoints.add(第20页);
mPoints.add(第21页);
mPoints.add(第22页);
mPoints.add(第23页);
mPoints.add(第24页);
mPoints.add(第25页);
mPoints.add(第26页);
mPoints.add(第27页);
mPoints.add(第28页);
mPoints.add(第29页);
mPoints.add(第30页);
}
公共画图视图(上下文、属性集属性){
超级(上下文,attrs);
mCanvas=新画布();
mPath=新路径();
mPaint=新油漆();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(颜色)。
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;

public class PaintView extends View{

    private Bitmap mBitmap;
    private Canvas mCanvas;
    private Path mPath;
    private Paint mPaint;
    private static final int TOUCH_TOLERANCE_DP = 20;
    private static final int BACKGROUND = 0xFFDDDDDD;
    private List<Point> mPoints = new ArrayList<Point>();
    private int mLastPointIndex = 0;
    private int marks = 0;
    private int mTouchTolerance;
    private boolean isPathStarted = false;
    private ActivityHolder paintHolder = ActivityHolder.getInstance();


    public PaintView(Context context) {
        super(context);
        mCanvas = new Canvas();
        mPath = new Path();
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(Color.BLACK);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(12);
        mTouchTolerance = dp2px(TOUCH_TOLERANCE_DP);        

        // TODO just test points
        Point p1 = new Point(133, 123);
        Point p2 = new Point(149, 136);
        Point p3 = new Point(182, 137);
        Point p4 = new Point(206, 118);
        Point p5 = new Point(208, 87);
        Point p6 = new Point(187, 71);
        Point p7 = new Point(144, 78);
        Point p8 = new Point(124, 101);
        Point p9 = new Point(113, 128);
        Point p10 = new Point(112, 157);
        Point p11 = new Point(119, 188);
        Point p12 = new Point(134, 209);
        Point p13 = new Point(162, 228);
        Point p14 = new Point(194, 238);
        Point p15 = new Point(232, 240);
        Point p16 = new Point(263, 237);
        Point p17 = new Point(289, 224);
        Point p18 = new Point(315, 204);
        Point p19 = new Point(332, 174);
        Point p20 = new Point(339, 128);
        Point p21 = new Point(329, 95);
        Point p22 = new Point(304, 73);
        Point p23 = new Point(280, 69);
        Point p24 = new Point(254, 87);
        Point p25 = new Point(248, 116);
        Point p26 = new Point(259, 143);
        Point p27 = new Point(278, 153);
        Point p28 = new Point(241, 157);
        Point p29 = new Point(192, 160);
        Point p30 = new Point(150, 159);
        mPoints.add(p1);
        mPoints.add(p2);
        mPoints.add(p3);
        mPoints.add(p4);
        mPoints.add(p5);
        mPoints.add(p6);
        mPoints.add(p7);
        mPoints.add(p8);
        mPoints.add(p9);
        mPoints.add(p10);
        mPoints.add(p11);
        mPoints.add(p12);
        mPoints.add(p13);
        mPoints.add(p14);
        mPoints.add(p15);
        mPoints.add(p16);
        mPoints.add(p17);
        mPoints.add(p18);
        mPoints.add(p19);
        mPoints.add(p20);
        mPoints.add(p21);
        mPoints.add(p22);
        mPoints.add(p23);
        mPoints.add(p24);
        mPoints.add(p25);
        mPoints.add(p26);
        mPoints.add(p27);
        mPoints.add(p28);
        mPoints.add(p29);
        mPoints.add(p30);
    }

    public PaintView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mCanvas = new Canvas();
        mPath = new Path();
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(Color.BLACK);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(12);
        mTouchTolerance = dp2px(TOUCH_TOLERANCE_DP);

        // TODO just test points
        Point p1 = new Point(133, 123);
        Point p2 = new Point(149, 136);
        Point p3 = new Point(182, 137);
        Point p4 = new Point(206, 118);
        Point p5 = new Point(208, 87);
        Point p6 = new Point(187, 71);
        Point p7 = new Point(144, 78);
        Point p8 = new Point(124, 101);
        Point p9 = new Point(113, 128);
        Point p10 = new Point(112, 157);
        Point p11 = new Point(119, 188);
        Point p12 = new Point(134, 209);
        Point p13 = new Point(162, 228);
        Point p14 = new Point(194, 238);
        Point p15 = new Point(232, 240);
        Point p16 = new Point(263, 237);
        Point p17 = new Point(289, 224);
        Point p18 = new Point(315, 204);
        Point p19 = new Point(332, 174);
        Point p20 = new Point(339, 128);
        Point p21 = new Point(329, 95);
        Point p22 = new Point(304, 73);
        Point p23 = new Point(280, 69);
        Point p24 = new Point(254, 87);
        Point p25 = new Point(248, 116);
        Point p26 = new Point(259, 143);
        Point p27 = new Point(278, 153);
        Point p28 = new Point(241, 157);
        Point p29 = new Point(192, 160);
        Point p30 = new Point(150, 159);
        mPoints.add(p1);
        mPoints.add(p2);
        mPoints.add(p3);
        mPoints.add(p4);
        mPoints.add(p5);
        mPoints.add(p6);
        mPoints.add(p7);
        mPoints.add(p8);
        mPoints.add(p9);
        mPoints.add(p10);
        mPoints.add(p11);
        mPoints.add(p12);
        mPoints.add(p13);
        mPoints.add(p14);
        mPoints.add(p15);
        mPoints.add(p16);
        mPoints.add(p17);
        mPoints.add(p18);
        mPoints.add(p19);
        mPoints.add(p20);
        mPoints.add(p21);
        mPoints.add(p22);
        mPoints.add(p23);
        mPoints.add(p24);
        mPoints.add(p25);
        mPoints.add(p26);
        mPoints.add(p27);
        mPoints.add(p28);
        mPoints.add(p29);
        mPoints.add(p30);
    }

    public PaintView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mCanvas = new Canvas();
        mPath = new Path();
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(Color.BLACK);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(12);
        mTouchTolerance = dp2px(TOUCH_TOLERANCE_DP);
    }

    protected void onSizeChanged(int width, int height, int oldWidth,
            int oldHeight) {
        super.onSizeChanged(width, height, oldWidth, oldHeight);
        clear();

    }

    protected void onDraw(Canvas canvas) {
        canvas.drawColor(BACKGROUND);
        canvas.drawBitmap(mBitmap, 0, 0, null);
        canvas.drawPath(mPath, mPaint);

        // TODO remove if you dont want points to be drawn
        for (Point point : mPoints) {
            canvas.drawPoint(point.x, point.y, mPaint);
        }
    }

    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            touch_start(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_MOVE:
            touch_move(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            touch_up(x, y);
            invalidate();
            break;
        }
        return true;
    }

    private void touch_start(float x, float y) {

        if (checkPoint(x, y, mLastPointIndex)) {
            mPath.reset();
            // user starts from given point so path can beis started
            isPathStarted = true;
        } else {
            // user starts move from point which doen's belongs to mPinst list
            isPathStarted = false;
        }

    }

    // ADDED WITH LAST EDIT
    private void touch_move(float x, float y) {
        // draw line with finger move
        if (isPathStarted) {
            mPath.reset();
            Point p = mPoints.get(mLastPointIndex);
            mPath.moveTo(p.x, p.y);
            if (checkPoint(x, y, mLastPointIndex + 1)) {
                p = mPoints.get(mLastPointIndex + 1);
                mPath.lineTo(p.x, p.y);
                mCanvas.drawPath(mPath, mPaint);
                mPath.reset();
                ++mLastPointIndex;
                marks++;
                update();
            } else {
                mPath.lineTo(x, y);
            }
        }
    }

    private void update() {
        // TODO Auto-generated method stub
        String newMarks = "";
    newMarks = Integer.toString(marks);

            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            // when you set the new value all your observers will be notified
            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

        paintHolder.setNewValue(newMarks);

            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


        Log.e("Marks", ":" + newMarks);
    }

    /**
     * Draws line.
     */
    private void touch_up(float x, float y) {
        mPath.reset();
        marks--;
        update();
        if (checkPoint(x, y, mLastPointIndex + 1) && isPathStarted) {
            // move finished at valid point so draw whole line

            // start point
            Point p = mPoints.get(mLastPointIndex);
            mPath.moveTo(p.x, p.y);
            // end point
            p = mPoints.get(mLastPointIndex + 1);
            mPath.lineTo(p.x, p.y);
            mCanvas.drawPath(mPath, mPaint);
            mPath.reset();
            // increment point index
            ++mLastPointIndex;
            isPathStarted = false;
        }

    }

    /**
     * Sets paint
     * 
     * @param paint
     */
    public void setPaint(Paint paint) {
        this.mPaint = paint;
    }

    /**
     * Returns image as bitmap
     * 
     * @return
     */
    public Bitmap getBitmap() {
        return mBitmap;
    }

    /**
     * Clears canvas
     */
    public void clear() {
        mBitmap = Bitmap.createBitmap(getWidth(), getHeight(),
                Bitmap.Config.ARGB_8888);
        mBitmap.eraseColor(BACKGROUND);
        mCanvas.setBitmap(mBitmap);
        invalidate();
    }

    /**
     * Checks if user touch point with some tolerance
     */
    private boolean checkPoint(float x, float y, int pointIndex) {
        if (pointIndex == mPoints.size()) {
            // out of bounds
            return false;
        }
        Point point = mPoints.get(pointIndex);
        if (x > (point.x - mTouchTolerance) && x < (point.x + mTouchTolerance)) {
            if (y > (point.y - mTouchTolerance)
                    && y < (point.y + mTouchTolerance)) {
                return true;
            }
        }
        return false;
    }

    public List<Point> getPoints() {
        return mPoints;
    }

    public void setPoints(List<Point> points) {
        this.mPoints = points;
    }

    private int dp2px(int dp) {
        Resources r = getContext().getResources();
        float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
                r.getDisplayMetrics());
        return (int) px;
    }


}