从View To Activity传递数据

时间:2014-08-14 15:23:42

标签: android android-activity android-view

我需要在活动中的某些计算中使用视图宽度和高度。

在SO Q& A中我看到了

  @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
            int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
            this.setMeasuredDimension(parentWidth, parentHeight);
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        }

它有效,但我的问题是:

1)我如何将其传递给活动?

2)或者我应该将我的CustomView作为内部类放入Activity文件中,如下所示

public class MainActivity extends ActionBarActivity {



    int parentHeight=0;
    int parentWidth=0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        Bundle aBundle=new Bundle();
        MyView myView = new MyView(this);

        Binary c=calculateCoordinates();


        aBundle.putSerializable("coordinate", c);
        myView.setData(aBundle);

        myView.setBackgroundColor(Color.WHITE);
        setContentView(myView);
    }


    public Binary calculateCoordinates(){

            Random generator = new Random();
            Binary c=new Binary();
            c.setX(generator.nextInt(parentWidth-1));
            c.setY(generator.nextInt(parentHeight-1));

        return c;

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        //int action = event.getAction();
        switch (event.getAction()){

        case MotionEvent.ACTION_UP:
            Intent intent = getIntent();
            finish();
            startActivity(intent);
        break;
        }
        return true;
    }







    public class MyView extends View {

        Bundle bundle = new Bundle();

        Paint paint = new Paint();

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

        @Override
        public void onDraw(Canvas canvas) {
            paint.setColor(Color.BLACK);
            paint.setStrokeWidth(3);
            Binary c = (Binary)bundle.getSerializable("coordinate");
            canvas.drawRect(c.getX(), c.getY(), c.getX()+1, c.getY()+1, paint);

        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            parentWidth = MeasureSpec.getSize(widthMeasureSpec);
            parentHeight = MeasureSpec.getSize(heightMeasureSpec);
            this.setMeasuredDimension(parentWidth, parentHeight);
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        }



        public void setData(Bundle bundle){
            this.bundle=bundle;

        }


    }



}

但是如果是这样的话我就不知道什么时候准确得到了测量结果,并且如果在调用坐标计算之前已经得到了测量结果。

2 个答案:

答案 0 :(得分:0)

一旦将视图放置在您的实际页面上,视图中的OnMeasure功能就会被调用。

因此,假设您想要在单击某个按钮或其他内容时获取宽度和高度,并希望将这些值传递给另一个活动。

将您的视图放在XML文件中:

<your.namespace.app.MyView
     xmlns:app="http://schemas.android.com/apk/res/novoda.tastecard"
     android:id="@+id/myView"
     android:layout_width="match_parent"
     ...../>

然后在您的活动中引用您的观看次数:

mMyView = findViewById(R.id.myView);

然后你可以这样做:

int width = myView.getWidth();
int height = myView.getHeight();

那应该返回视图的宽度和高度。

然后执行以下操作以使用您的值调用新活动:

Intent intent = new Intent(this, NewActivity.class);
intent.putExtra("width", width);
intent.putExtra("height", height);
startActivity(intent);

答案 1 :(得分:0)

活动类

将此添加到您的OnCreate代码中。

final ViewTreeObserver obs = myView.getViewTreeObserver();
obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw () {
       int height = myView.getHeight();
       int width = myView.getWidth();

 }

当绘制视图时,将使用正确的宽度和高度调用此函数。