Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android java.lang.NullPointerException:在按钮上单击Listener_Android - Fatal编程技术网

Android java.lang.NullPointerException:在按钮上单击Listener

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

每当打开自定义对话框时,应用程序就会崩溃,并抛出以下错误

我检查了重复的初始化,但找不到任何东西

在MainActivity.java中

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);