使用ContextMenu在listview中传递所选项目的ID时出现Android错误

时间:2014-02-08 05:01:08

标签: android mysql listview android-contextmenu

我有一个listview,长按将显示contextmenu更新,删除和发送处方。现在,当我点击更新时,它将转到EditPatientActivity。将MySql数据库中的所有数据填充到表单中。我的问题是,当我点击更新菜单时,它崩溃了应用程序。我不知道为什么。请帮我。我不知道问题是在传递uid还是遗漏了EditPatientActivity。

edit_patient.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/white_bg" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:padding="10dip" >

        <!-- Error message -->

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Patient Update"
            android:textAppearance="?android:attr/textAppearanceLarge" />


        <TextView
            android:id="@+id/register_error"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:textColor="#e30000"
            android:textStyle="bold" />

        <EditText
            android:id="@+id/fname"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="First Name" />

        <EditText
            android:id="@+id/lname"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="Last Name" />

        <EditText
            android:id="@+id/username"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="36dp"
            android:ems="10"
            android:hint="Username" />

        <EditText
            android:id="@+id/password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="26dp"
            android:ems="10"
            android:hint="Password"
            android:inputType="textPassword" />

        <EditText
            android:id="@+id/contacts"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/regPassword"
            android:layout_alignRight="@+id/regPassword"
            android:layout_below="@+id/regPassword"
            android:ems="10"
            android:hint="Contacts" >

            <requestFocus android:layout_width="wrap_content" />

        </EditText>

        <EditText
            android:id="@+id/address"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/editText1"
            android:layout_alignRight="@+id/editText1"
            android:layout_below="@+id/editText1"
            android:ems="10"
            android:hint="Address" />

        <Spinner
            android:id="@+id/gender"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/datetext"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Date"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <Button
            android:id="@+id/pickdate"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Birthday" />

        <RelativeLayout
            android:layout_width="295dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.06" >

            <Button
                android:id="@+id/add"
                style="?android:attr/buttonStyleSmall"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_alignParentLeft="true"
                android:layout_marginLeft="84dp"
                android:text="+" />

            <Button
                android:id="@+id/sub"
                style="?android:attr/buttonStyleSmall"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_marginRight="14dp"
                android:layout_toLeftOf="@+id/number"
                android:text="-" />

            <TextView
                android:id="@+id/number"
                android:layout_width="40dp"
                android:layout_height="38dp"
                android:layout_alignParentTop="true"
                android:layout_alignRight="@+id/add"
                android:layout_marginRight="18dp"
                android:ems="10"
                android:hint="age"
                android:textAppearance="?android:attr/textAppearanceMedium" />

        </RelativeLayout>

        <ImageView
            android:id="@+id/imgUpdate"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            android:layout_marginRight="28dp"
            android:layout_weight="0.16"
            android:src="@drawable/update" />

    </LinearLayout>

</ScrollView>

EditPatientActivity

package com.example.healthhelpv2;
//import android.widget.DatePicker;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import library.JSONParser2;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

//import com.mkyong.android.R;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
//import android.widget.RadioButton;
//import android.widget.Spinner;
//import android.widget.NumberPicker;
public class EditPatientActivity extends Activity implements View.OnClickListener{

    EditText inputfname, inputlname, inputbirthday, inputcontact, inputaddress;
    EditText txtCreatedAt, inputusername, inputpassword;
    TextView inputdate, inputage;
    Spinner inputgender;
    ImageView imgUpdate;
    Button sub, add, pickdate;
    int counter = 0;
    DateFormat formate = DateFormat.getDateInstance();
    Calendar calendar = Calendar.getInstance();
    String uid;


    // Progress Dialog
    private ProgressDialog pDialog;

    // JSON parser class
    JSONParser2 jsonParser = new JSONParser2();

    // single product url
    private static final String url_patient_detials = "http://10.0.2.2/android_connect/get_patient_details.php";

    // url to update product
    private static final String url_update_patient = "http://10.0.2.2/android_connect/updatepatient.php";

    // url to delete product
    //private static final String url_delete_patient = "http://10.0.2.2/android_connect/delete_patient.php";

    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_PATIENT = "patient";
    private static final String TAG_UID = "uid";
    private static final String TAG_FNAME = "fname";
    private static final String TAG_USERNAME = "username";
    private static final String TAG_PASSWORD = "password";
    private static final String TAG_LNAME = "lname";
    private static final String TAG_ADDRESS = "address";
    private static final String TAG_GENDER = "gender";
    //private static final String TAG_GENDER2 = "female";
    private static final String TAG_CONTACT = "contact";
    private static final String TAG_AGE = "age";
    private static final String TAG_BIRTHDAY = "birthday";


    public void onBackPressed() {
        super.onBackPressed();
        //userFunctions.logoutUser(getApplicationContext());
        Intent intent = new Intent(this, EditMenuActivity.class);
        startActivity(intent);
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.edit_patient);

        // save button
        //btnsave = (Button) findViewById(R.id.btnsave);
        //btndelete = (Button) findViewById(R.id.btndelete);

        // getting product details from intent
        Intent i = getIntent();

        // getting product id (pid) from intent
        uid = i.getStringExtra(TAG_UID);

        // Getting complete product details in background thread
        new GetProductDetails().execute();
        imgUpdate = (ImageView) findViewById(R.id.imgUpdate);
        // save button click event
        imgUpdate.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // starting background task to update product
                new SaveProductDetails().execute();
            }
        });

        //gender
        pickdate = (Button) findViewById(R.id.pickdate);
        pickdate.setOnClickListener(this);
        updateDate();
        //inputdate = (TextView) findViewById(R.id.datetext);


        ArrayAdapter adapter = ArrayAdapter.createFromResource(
                  this, R.array.gender_array, android.R.layout.simple_spinner_item);
                  adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                  inputgender.setAdapter(adapter);

        //age form
        add = (Button) findViewById(R.id.add);
        sub = (Button) findViewById(R.id.sub);

          add.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {
                counter++;
                inputage.setText( "" + counter);
                }
            });

            sub.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {
                counter--;
                inputage.setText( "" + counter);
                }
            });
    /*  // Delete button click event
        btndelete.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // deleting product in background thread
                new DeleteProduct().execute();
            }
        });
     */
    }

    /**
     * Background Async Task to Get complete product details
     * */
    class GetProductDetails extends AsyncTask<String, String, String> {

        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(EditPatientActivity.this);
            pDialog.setMessage("Loading patient details. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        /**
         * Getting product details in background thread
         * */
        protected String doInBackground(String... params) {

            // updating UI from Background Thread
            runOnUiThread(new Runnable() {
                public void run() {
                    // Check for success tag
                    int success;
                    try {
                        // Building Parameters
                        List<NameValuePair> params = new ArrayList<NameValuePair>();
                        params.add(new BasicNameValuePair("uid", uid));

                        // getting product details by making HTTP request
                        // Note that product details url will use GET request
                        JSONObject json = jsonParser.makeHttpRequest(
                                url_patient_detials, "GET", params);

                        // check your log for json response
                        Log.d("Single Patient Details", json.toString());

                        // json success tag
                        success = json.getInt(TAG_SUCCESS);
                        if (success == 1) {
                            // successfully received product details
                            JSONArray productObj = json
                                    .getJSONArray(TAG_PATIENT); // JSON Array

                            // get first product object from JSON Array
                            JSONObject product = productObj.getJSONObject(0);

                            // product with this pid found
                            // Edit Text
                            inputusername= (EditText) findViewById(R.id.username);
                            inputpassword = (EditText) findViewById(R.id.password);
                            inputfname= (EditText) findViewById(R.id.fname);
                            inputlname = (EditText) findViewById(R.id.lname);
                            inputcontact = (EditText) findViewById(R.id.contacts);
                            inputaddress = (EditText) findViewById(R.id.address);
                            inputdate = (TextView) findViewById(R.id.datetext);//bday
                            inputgender = (Spinner) findViewById(R.id.gender);
                            inputage = (TextView) findViewById(R.id.number);
                            //rdmale = (RadioButton) findViewById(R.id.rdmale);
                            //rdfemale = (RadioButton) findViewById(R.id.rdfemale);




                            // display product data in EditText
                            inputusername.setText(product.getString(TAG_USERNAME));
                            inputpassword.setText(product.getString(TAG_PASSWORD));
                            inputfname.setText(product.getString(TAG_FNAME));
                            inputlname.setText(product.getString(TAG_LNAME));
                            inputcontact.setText(product.getString(TAG_CONTACT));
                            inputaddress.setText(product.getString(TAG_ADDRESS));
                            if(product.getString(TAG_GENDER).equals("male"))    
                                 inputgender.setSelection(0);//if male is at 0 position
                            else
                                 inputgender.setSelection(1);//if female is at 1 position
                            inputage.setText(product.getString(TAG_AGE));
                            inputdate.setText(product.getString(TAG_BIRTHDAY));
                        }else{
                            // product with pid not found
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });

            return null;
        }


        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once got all details
            pDialog.dismiss();
        }
    }

    /**
     * Background Async Task to  Save product Details
     * */
    class SaveProductDetails extends AsyncTask<String, String, String> {

        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(EditPatientActivity.this);
            pDialog.setMessage("Saving patient ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        /**
         * Saving product
         * */
        protected String doInBackground(String... args) {

            // getting updated data from EditTexts
            String username = inputusername.getText().toString();
            String password = inputpassword.getText().toString();
            String fname = inputfname.getText().toString();
            String lname = inputlname.getText().toString();
            String contact = inputcontact.getText().toString();
            String age = inputage.getText().toString();
            String address = inputaddress.getText().toString();
            //String birthday = inputbirthday.getText().toString();
            String gender = inputgender.getSelectedItem().toString();
            String bday = inputdate.getText().toString();

            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            //params.add(new BasicNameValuePair(TAG_PID, pid));
            params.add(new BasicNameValuePair(TAG_USERNAME, username));
            params.add(new BasicNameValuePair(TAG_PASSWORD, password));
            params.add(new BasicNameValuePair(TAG_FNAME, fname));
            params.add(new BasicNameValuePair(TAG_LNAME, lname));
            params.add(new BasicNameValuePair(TAG_ADDRESS, address));
            params.add(new BasicNameValuePair(TAG_BIRTHDAY, bday));
            params.add(new BasicNameValuePair(TAG_AGE, age));
            params.add(new BasicNameValuePair(TAG_GENDER, gender));
            params.add(new BasicNameValuePair(TAG_CONTACT, contact));



            // sending modified data through http request
            // Notice that update product url accepts POST method
            JSONObject json = jsonParser.makeHttpRequest(url_update_patient,
                    "POST", params);

            // check json success tag
            try {
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {
                    // successfully updated
                    Intent i = getIntent();
                    // send result code 100 to notify about product update
                    setResult(100, i);
                    finish();
                } else {
                    // failed to update product
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }


        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once product uupdated
            pDialog.dismiss();
        }
    }

    /*****************************************************************
     * Background Async Task to Delete Product
     * */
    /*class DeleteProduct extends AsyncTask<String, String, String> {

        /**
         * Before starting background thread Show Progress Dialog
         * */
    /*
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(EditPatientActivity.this);
            pDialog.setMessage("Deleting Patient...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        /**
         * Deleting product
         * */
    /*  protected String doInBackground(String... args) {

            // Check for success tag
            int success;
            try {
                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("uid", uid));

                // getting product details by making HTTP request
                JSONObject json = jsonParser.makeHttpRequest(
                        url_delete_patient, "POST", params);

                // check your log for json response
                Log.d("Delete Patient", json.toString());

                // json success tag
                success = json.getInt(TAG_SUCCESS);
                if (success == 1) {
                    // product successfully deleted
                    // notify previous activity by sending code 100
                    Intent i = getIntent();
                    // send result code 100 to notify about product deletion
                    setResult(100, i);
                    finish();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once product deleted
            pDialog.dismiss();

        }




     public void updateDate(){
         inputdate.setText(formate.format(calendar.getTime()));
     }
     //setdate
     public void setDate(){

         new DatePickerDialog(EditPatientActivity.this,d,calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)).show();
     }
    //date form
        DatePickerDialog.OnDateSetListener d=new DatePickerDialog.OnDateSetListener(){

            @Override
            public void onDateSet(DatePicker View, int year, int monthOfYear, int dayOfMonth){

                calendar.set(Calendar.YEAR,year);
                calendar.set(Calendar.MONTH,monthOfYear);
                calendar.set(Calendar.DAY_OF_MONTH,dayOfMonth);
                updateDate();


            }


        };

        @Override
        public void onClick(View v){
            setDate();
        }
}

logcat的

02-08 15:33:06.042: E/AndroidRuntime(276): FATAL EXCEPTION: main
02-08 15:33:06.042: E/AndroidRuntime(276): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.healthhelpv2/com.example.healthhelpv2.EditPatientActivity}: java.lang.NullPointerException
02-08 15:33:06.042: E/AndroidRuntime(276):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
02-08 15:33:06.042: E/AndroidRuntime(276):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
02-08 15:33:06.042: E/AndroidRuntime(276):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
02-08 15:33:06.042: E/AndroidRuntime(276):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
02-08 15:33:06.042: E/AndroidRuntime(276):  at android.os.Handler.dispatchMessage(Handler.java:99)
02-08 15:33:06.042: E/AndroidRuntime(276):  at android.os.Looper.loop(Looper.java:123)
02-08 15:33:06.042: E/AndroidRuntime(276):  at android.app.ActivityThread.main(ActivityThread.java:4627)
02-08 15:33:06.042: E/AndroidRuntime(276):  at java.lang.reflect.Method.invokeNative(Native Method)
02-08 15:33:06.042: E/AndroidRuntime(276):  at java.lang.reflect.Method.invoke(Method.java:521)
02-08 15:33:06.042: E/AndroidRuntime(276):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-08 15:33:06.042: E/AndroidRuntime(276):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-08 15:33:06.042: E/AndroidRuntime(276):  at dalvik.system.NativeStart.main(Native Method)
02-08 15:33:06.042: E/AndroidRuntime(276): Caused by: java.lang.NullPointerException
02-08 15:33:06.042: E/AndroidRuntime(276):  at com.example.healthhelpv2.EditPatientActivity.onCreate(EditPatientActivity.java:125)
02-08 15:33:06.042: E/AndroidRuntime(276):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-08 15:33:06.042: E/AndroidRuntime(276):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
02-08 15:33:06.042: E/AndroidRuntime(276):  ... 11 more

1 个答案:

答案 0 :(得分:1)

在评论专栏105中,imgUpdate.setOnClickListener(new View.OnClickListener() {表示imgUpdate为空。

所以改变这个

imgUpdate = (ImageView) findViewById(R.id.imgReg);

imgUpdate = (ImageView) findViewById(R.id.imgUpdate);

因为你有

<ImageView
        android:id="@+id/imgUpdate"  // id is imgUpdate