我正在创建一个计算器。如您所知,它有许多按钮需要根据屏幕尺寸进行调整。我将代码放入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/