首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用onDraw/drawRect从editText从mainActivity生成一个矩形

如何使用onDraw/drawRect从editText从mainActivity生成一个矩形
EN

Stack Overflow用户
提问于 2019-06-13 20:49:42
回答 1查看 325关注 0票数 0

基本上,我试图从用户那里收集房间的大小.(例如20x20大小的房间)。使用在mainActivity上收集的这些维度,将数据发送到结果活动,并使用onDraw/on测量创建一个简单的框。

简而言之,我想从用户那里收集mainActivity中的框的大小。然后在结果活动中显示框的完整图像。

我已经用数据完成了从一个活动到另一个活动的传递意图。它使用收集的数据绘制一个形状,我有困难。

代码语言:javascript
运行
复制
public class MainActivity extends AppCompatActivity {

    //variables
    Button btnCalculate, btnReset;
    Spinner spinSpeaker;
    EditText editLength, editWidth, editHeight;
    String t1,t2,t3;

    int numLength, numWidth, numHeight, numResult=0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //connecting variables to GUI elements
        btnCalculate= findViewById(R.id.btnCalculate);
        btnReset = findViewById(R.id.btnReset2);
        spinSpeaker = findViewById(R.id.spinSpeaker);
        editLength= findViewById(R.id.editLength);
        editWidth = findViewById(R.id.editWidth);
        editHeight = findViewById(R.id.editHeight);




        //adding function to the calculate button
        btnCalculate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //parsing text to integers
                t1=editLength.getText().toString();
                t2=editWidth.getText().toString();
                t3=editHeight.getText().toString();

                if (t3.equals("")) {
                    editHeight.setText("11");
                }else if (t2.equals("")) {
                    editWidth.setText("11");
                }else if (t1.equals("")) {
                    editLength.setText("11");
                }else{
                    numLength = Integer.parseInt(t1);
                    numWidth = Integer.parseInt(t2);
                    numHeight = Integer.parseInt(t3);
                }

                //alert to contact Pro design
                if ((numLength>=999)||(numWidth>=999)||(numHeight>=20)) {

                    Toast.makeText(MainActivity.this, R.string.contactPro,
                            Toast.LENGTH_LONG).show();
                }else {
                    //calculating volume
                    numResult = numHeight * numWidth * numLength;

                    //sending data to other activities
                    Intent intent = new Intent(MainActivity.this, Result.class);
                    intent.putExtra("varHeight", numHeight);
                    intent.putExtra("varWidth", numWidth);
                    intent.putExtra("varLength", numLength);
                    intent.putExtra("varResult", numResult);
                    startActivity(intent);
                }
            }
        });


    }
代码语言:javascript
运行
复制
//Result activity
public class Result extends AppCompatActivity {

    TextView tim;
    MyCanvas mycanvas;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mycanvas = new MyCanvas(this);
        setContentView(R.layout.activity_result);
        setContentView(Jim);


        //Pulling variables from main activity
        Intent variables = getIntent();
        //int length = variables.getIntExtra("varLength",0);
        //int width =variables.getIntExtra("varWidth",0);
        int totalResult = variables.getIntExtra("varResult",0);
        //showing total
        String result = String.valueOf(totalResult);
        tim = findViewById(R.id.txtResult);
        tim.setText(result);


        //Calling the reset button method
        configureResetBtn();

    }

        public void configureResetBtn(){
    Button btnReset=findViewById(R.id.btnReset2);
    btnReset.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //startActivity(new Intent(Result.this, MainActivity.class));
            finish();
        }
    });
}


}
代码语言:javascript
运行
复制
//MyCanvas activity
public class MyCanvas extends AppCompatActivity {


    public MyCanvas(Result result) {
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent variables = getIntent();
        final int length = variables.getIntExtra("varLength", 0);
        final int width = variables.getIntExtra("varWidth", 0);


         class Jim extends View {

            Paint paint = new Paint();
            Rect rect = new Rect();

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

            @Override
            protected void onDraw(android.graphics.Canvas canvas) {
                super.onDraw(canvas);
                paint.setStrokeWidth(3);

                canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), paint);
            }

            @Override
            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);

                setMeasuredDimension(length,width);
            }
        }
    }
}

预期的结果是显示一个框,它是基于用户的维度(例如,20x20)。但是,我得到了这个错误:

android.widget.Button.setOnClickListener(android.view.View$OnClickListener)‘:尝试在空对象引用上调用虚拟方法的void java.lang.NullPointerException

但是当我删除试图绘制框的代码时,我的按钮就能工作了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-14 03:28:01

不要在ResultActivity中设置两次内容视图,而是在R.layout.activity_result中使用SurfaceView

代码语言:javascript
运行
复制
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <SurfaceView
        android:id="@+id/surface_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
//....

</FrameLayout>

在ResultActivity中

代码语言:javascript
运行
复制
SurfaceView surfaceView = findViewById(R.id.surface_view);

surfaceView.getHolder().addCallback(new Callback() {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        Canvas canvas = holder.lockCanvas();
         // draw
        Paint paint = new Paint();
        paint.setStrokeWidth(3);
        canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), paint);

        holder.unlockCanvasAndPost(canvas);
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56588381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档