Android java.lang.NullPointerException:在按钮上单击Listener
每当打开自定义对话框时,应用程序就会崩溃,并抛出以下错误 我检查了重复的初始化,但找不到任何东西 在MainActivity.java中Android java.lang.NullPointerException:在按钮上单击Listener,android,Android,每当打开自定义对话框时,应用程序就会崩溃,并抛出以下错误 我检查了重复的初始化,但找不到任何东西 在MainActivity.java中 public class MainActivity extends AppCompatActivity { PieChart pieChart; ImageView edit; Dialog editDialog; EditText edit_cal,edit_carb,edit_prot,edit_fats; St
public class MainActivity extends AppCompatActivity {
PieChart pieChart;
ImageView edit;
Dialog editDialog;
EditText edit_cal,edit_carb,edit_prot,edit_fats;
String cal,carb,prot,fats;
Button save;
public static final String SHARED_PREFS = "sharedPrefs";
public static final String CAL = "text";
public static final String CARB = "text";
public static final String PROT = "text";
public static final String FATS = "text";
TextView tcal,tcarb,tprot,tfats;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit=findViewById(R.id.edit);
pieChart=findViewById(R.id.pie);
tcal=findViewById(R.id.tcal);
tcarb=findViewById(R.id.tcarb);
tprot=findViewById(R.id.tprot);
tfats=findViewById(R.id.tfats);
saveData();
loadData();
updateViews();
edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
custom_Dialog();
}
});
}
private void custom_Dialog() {
editDialog=new Dialog(MainActivity.this);
editDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
editDialog.setCancelable(true);
editDialog.setContentView(R.layout.edit_nutrient);
editDialog.show();
edit_cal=findViewById(R.id.edit_cal);
edit_carb=findViewById(R.id.edit_carb);
edit_prot=findViewById(R.id.edit_prot);
edit_fats=findViewById(R.id.edit_fats);
save=findViewById(R.id.savebtn);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cal=edit_cal.getText().toString();
carb=edit_carb.getText().toString();
prot=edit_prot.getText().toString();
fats=edit_fats.getText().toString();
if(isValid(cal,carb,prot,fats))
{
saveData();
loadData();
updateViews();
editDialog.dismiss();
}
else
{
Toast.makeText(MainActivity.this,"Please fill your diet plan correctly",Toast.LENGTH_SHORT).show();
}
}
});
}
在edit_.xml中
<Button
android:id="@+id/savebtn"
android:layout_width="296dp"
android:layout_height="48dp"
android:layout_marginLeft="15dp"
android:layout_marginTop="340dp"
android:background="@drawable/button_default_2"
android:fontFamily="sans-serif-medium"
android:letterSpacing="-0.03"
android:text="Save"
android:textColor="#ffffff"
android:textSize="13sp"
android:textStyle="normal"
/>
您必须从布局创建
视图
,然后将其传递到创建对话框。还可以使用视图实例获取子元素。检查以下内容:
private void custom_Dialog() {
View view = LayoutInflater.from(this).inflate(R.layout.edit_nutrient, null, false);
editDialog=new Dialog(MainActivity.this);
editDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
editDialog.setCancelable(true);
editDialog.setContentView(view);
editDialog.show();
edit_cal = view.findViewById(R.id.edit_cal);
edit_carb = view.findViewById(R.id.edit_carb);
edit_prot = view.findViewById(R.id.edit_prot);
edit_fats = view.findViewById(R.id.edit_fats);
save = view.findViewById(R.id.savebtn);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cal=edit_cal.getText().toString();
carb=edit_carb.getText().toString();
prot=edit_prot.getText().toString();
fats=edit_fats.getText().toString();
if(isValid(cal,carb,prot,fats))
{
saveData();
loadData();
updateViews();
editDialog.dismiss();
}
else
{
Toast.makeText(MainActivity.this,"Please fill your diet plan correctly",Toast.LENGTH_SHORT).show();
}
}
});
}
在此,您可以设置对话框的内容视图: 但是,在这些行中,您搜索的是活动内部的视图,而不是对话框: 您需要使用对话框的
findViewById()
方法在其中搜索:
edit_cal=editDialog.findViewById(R.id.edit_cal);
edit_carb=editDialog.findViewById(R.id.edit_carb);
edit_prot=editDialog.findViewById(R.id.edit_prot);
edit_fats=editDialog.findViewById(R.id.edit_fats);
save=editDialog.findViewById(R.id.savebtn);
手动膨胀视图是合理的,但这将受到原始问题的影响:vanilla
findViewById()
在活动的视图层次结构中进行搜索。您可以在解决方案中使用view.findViewById()
。单击“保存”按钮时,将调用edit\u cal.getText()
,并抛出NPE,因为找不到它。
editDialog.setContentView(R.layout.edit_nutrient);
edit_cal=findViewById(R.id.edit_cal);
edit_carb=findViewById(R.id.edit_carb);
edit_prot=findViewById(R.id.edit_prot);
edit_fats=findViewById(R.id.edit_fats);
save=findViewById(R.id.savebtn);
edit_cal=editDialog.findViewById(R.id.edit_cal);
edit_carb=editDialog.findViewById(R.id.edit_carb);
edit_prot=editDialog.findViewById(R.id.edit_prot);
edit_fats=editDialog.findViewById(R.id.edit_fats);
save=editDialog.findViewById(R.id.savebtn);