我正在创建一个计算器。如您所知,它有许多按钮需要根据屏幕尺寸进行调整。我将代码放入onCreate中,但是它崩溃了,我将其放入OnClickListner中,它可以正常工作。开始活动。如何解决?

我首先在一个单独的类中进行了此操作,然后在MainActivity.java中进行了一个单独的功能。然后在onCreate。

我在前3次尝试中都访问了onCreate中的所有内容。

这是我在onClickListner中调整大小的代码-

findViewById(R.id.btnfix).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Context context = getApplicationContext();
                Button btn1 = (Button)findViewById(R.id.b1);Button btn2 = (Button) findViewById(R.id.b2);Button btn3 = (Button) findViewById(R.id.b3);Button btn4 = (Button) findViewById(R.id.b4);Button btn5 = (Button) findViewById(R.id.b5);Button btn6 = (Button) findViewById(R.id.b6);Button btn7 = (Button) findViewById(R.id.b7);Button btn8 = (Button) findViewById(R.id.b8);Button btn9 = (Button) findViewById(R.id.b9);Button btn0 = (Button) findViewById(R.id.b0);Button btnsqrt = (Button) findViewById(R.id.sqrt);Button btnexpo = (Button) findViewById(R.id.expo);Button btncb = (Button) findViewById(R.id.cb);Button btnob = (Button) findViewById(R.id.ob);Button btnadd = (Button) findViewById(R.id.add);Button btnsub = (Button) findViewById(R.id.sub);Button btnmul = (Button) findViewById(R.id.mul);Button btndiv =  (Button) findViewById(R.id.div);Button btnclr = (Button) findViewById(R.id.clr);Button btnlog = (Button) findViewById(R.id.log);


                DisplayMetrics dm = new DisplayMetrics();
                WindowManager windowManager = (WindowManager) context.getSystemService(WINDOW_SERVICE);
                windowManager.getDefaultDisplay().getMetrics(dm);
                int width = dm.widthPixels;
                int btnw = width/4;

                LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) btn1.getLayoutParams();
                params.width = btnw;
                btn1.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btn2.getLayoutParams();
                params.width = btnw;
                btn2.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btn3.getLayoutParams();
                params.width = btnw;
                btn3.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btn4.getLayoutParams();
                params.width = btnw;
                btn4.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btn5.getLayoutParams();
                params.width = btnw;
                btn5.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btn6.getLayoutParams();
                params.width = btnw;
                btn6.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btn7.getLayoutParams();
                params.width = btnw;
                btn7.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btn8.getLayoutParams();
                params.width = btnw;
                btn8.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btn9.getLayoutParams();
                params.width = btnw;
                btn9.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btn0.getLayoutParams();
                params.width = btnw;
                btn0.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btnadd.getLayoutParams();
                params.width = btnw;
                btnadd.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btnsub.getLayoutParams();
                params.width = btnw;
                btnsub.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btnmul.getLayoutParams();
                params.width = btnw;
                btnmul.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btndiv.getLayoutParams();
                params.width = btnw;
                btndiv.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btnsqrt.getLayoutParams();
                params.width = btnw;
                btnsqrt.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btnexpo.getLayoutParams();
                params.width = btnw;
                btnexpo.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btnob.getLayoutParams();
                params.width = btnw;
                btnob.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btncb.getLayoutParams();
                params.width = btnw;
                btncb.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btnlog.getLayoutParams();
                params.width = btnw;
                btnlog.setLayoutParams(params);

                params = (LinearLayout.LayoutParams) btnclr.getLayoutParams();
                params.width = btnw;
                btnclr.setLayoutParams(params);
            }
        });


而这仅在onCreate中-

@Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        textArea = (TextView) findViewById(R.id.edit_text);
        errorMessageText = (TextView) findViewById(R.id.error_message);
        errorMessageText.setVisibility(View.GONE);
        Context context = getApplicationContext();
        Button btn1 = (Button)findViewById(R.id.b1);Button btn2 = (Button) findViewById(R.id.b2);Button btn3 = (Button) findViewById(R.id.b3);Button btn4 = (Button) findViewById(R.id.b4);Button btn5 = (Button) findViewById(R.id.b5);Button btn6 = (Button) findViewById(R.id.b6);Button btn7 = (Button) findViewById(R.id.b7);Button btn8 = (Button) findViewById(R.id.b8);Button btn9 = (Button) findViewById(R.id.b9);Button btn0 = (Button) findViewById(R.id.b0);Button btnsqrt = (Button) findViewById(R.id.sqrt);Button btnexpo = (Button) findViewById(R.id.expo);Button btncb = (Button) findViewById(R.id.cb);Button btnob = (Button) findViewById(R.id.ob);Button btnadd = (Button) findViewById(R.id.add);Button btnsub = (Button) findViewById(R.id.sub);Button btnmul = (Button) findViewById(R.id.mul);Button btndiv =  (Button) findViewById(R.id.div);Button btnclr = (Button) findViewById(R.id.clr);Button btnlog = (Button) findViewById(R.id.log);


        DisplayMetrics dm = new DisplayMetrics();
        WindowManager windowManager = (WindowManager) context.getSystemService(WINDOW_SERVICE);
        windowManager.getDefaultDisplay().getMetrics(dm);
        int width = dm.widthPixels;
        int btnw = width/4;

        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) btn1.getLayoutParams();
        params.width = btnw;
        btn1.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btn2.getLayoutParams();
        params.width = btnw;
        btn2.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btn3.getLayoutParams();
        params.width = btnw;
        btn3.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btn4.getLayoutParams();
        params.width = btnw;
        btn4.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btn5.getLayoutParams();
        params.width = btnw;
        btn5.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btn6.getLayoutParams();
        params.width = btnw;
        btn6.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btn7.getLayoutParams();
        params.width = btnw;
        btn7.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btn8.getLayoutParams();
        params.width = btnw;
        btn8.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btn9.getLayoutParams();
        params.width = btnw;
        btn9.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btn0.getLayoutParams();
        params.width = btnw;
        btn0.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btnadd.getLayoutParams();
        params.width = btnw;
        btnadd.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btnsub.getLayoutParams();
        params.width = btnw;
        btnsub.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btnmul.getLayoutParams();
        params.width = btnw;
        btnmul.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btndiv.getLayoutParams();
        params.width = btnw;
        btndiv.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btnsqrt.getLayoutParams();
        params.width = btnw;
        btnsqrt.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btnexpo.getLayoutParams();
        params.width = btnw;
        btnexpo.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btnob.getLayoutParams();
        params.width = btnw;
        btnob.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btncb.getLayoutParams();
        params.width = btnw;
        btncb.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btnlog.getLayoutParams();
        params.width = btnw;
        btnlog.setLayoutParams(params);

        params = (LinearLayout.LayoutParams) btnclr.getLayoutParams();
        params.width = btnw;
        btnclr.setLayoutParams(params);


我尝试了n次,但只在onClickListner上工作。

最佳答案

它崩溃是因为尚未创建布局时您试图获取LayoutParams。尝试将Post添加到您的父布局,然后在其中进行逻辑处理。

例如

parentLayout.post(new Runnable() {
    @Override
    public void run() {
    //your code here
    }
   });

关于java - 在onCreate(不是声明或初始化)但在onClick中完成某些操作后,应用程序崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56400562/

10-11 03:43