0

我想要做的是在微调器中选择文本并将其保存到 mysql 数据库中。我需要一些帮助,因为在从微调器获取字符串后,我不知道如何传递字符串并在另一个类中使用它。以下是 add_blood_glucose_record.java 中的代码:

import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.InputType;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TimePicker;
import android.widget.Toast;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.sql.Time;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class AddBloodGlucoseRecord extends AppCompatActivity implements View.OnClickListener {
    Button btnSelectDate,btnSelectTime;
    private EditText editDate;
    //private EditText editTime;

    private DatePickerDialog DatePickerDialog;
    //private TimePickerDialog TimePickerDialog;

    private SimpleDateFormat dateFormatter;
    Spinner spinner;
    private EditText editPatientID;
    private EditText edit_sugar_con;
    String pid,sgrcon,measured,date,selection;

private String mItemSelectedMessageTemplate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_blood_glucose_record);


        mItemSelectedMessageTemplate =
                getString(R.string.spinner_message_template);
        Spinner spinner = (Spinner) findViewById(R.id.measured_time);

        spinner.setOnItemSelectedListener(new SpinnerInfo());



        dateFormatter = new SimpleDateFormat("yyyy-MM-dd hh:mm", Locale.TRADITIONAL_CHINESE);
        findViewsById();

        setDateTimeField();

        editPatientID = (EditText) findViewById(R.id.editPatientID);
        edit_sugar_con = (EditText) findViewById(R.id.edit_sugar_con);
    }


    private void findViewsById() {
        btnSelectDate=(Button)findViewById(R.id.edit_date);
        btnSelectDate.requestFocus();
        //editDate.setInputType(InputType.TYPE_NULL);
        //editDate.requestFocus();

       // editTime = (EditText) findViewById(R.id.edit_time);
       // editTime.setInputType(InputType.TYPE_NULL);
    }


    private void setDateTimeField() {
        btnSelectDate.setOnClickListener(this);
        //editTime.setOnClickListener(this);

        Calendar newCalendar = Calendar.getInstance();
        DatePickerDialog = new DatePickerDialog(this, new android.app.DatePickerDialog.OnDateSetListener() {

            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                Calendar newDate = Calendar.getInstance();
                newDate.set(year, monthOfYear, dayOfMonth);
                btnSelectDate.setText(dateFormatter.format(newDate.getTime()));
            }

        },newCalendar.get(Calendar.YEAR), newCalendar.get(Calendar.MONTH), newCalendar.get(Calendar.DAY_OF_MONTH));
    }

        /**TimePickerDialog = new TimePickerDialog(this, new android.app.TimePickerDialog.OnTimeSetListener(){
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                Calendar newTime = Calendar.getInstance();
                newTime.set(hourOfDay, minute);
                editTime.setText(newTime.getTime());
            }

        },newCalendar.get(Calendar.HOUR_OF_DAY), newCalendar.get(Calendar.MINUTE));
    }
         **/

    private void showToast(String text) {

        Toast.makeText(this, text, Toast.LENGTH_LONG).show();
    }


public class SpinnerInfo implements AdapterView.OnItemSelectedListener {
    private boolean isFirst = true;
    @Override
    public void onItemSelected(AdapterView<?> spinner, View selectedView,
                               int selectedIndex, long id) {
        if (isFirst) {
            isFirst = false;
        } else {

            String selection =
                    //spinner.getItemAtPosition(selectedIndex).toString();
                    spinner.getSelectedItem().toString();
            String message =
                    String.format(mItemSelectedMessageTemplate, selection);
            showToast(message);
        }
    }


    @Override
    public void onNothingSelected(AdapterView<?> spinner) {
// Won’t be invoked unless you programmatically remove entries
    }
}

然后,我使用以下代码将字符串传递给 BackgroundTask.java,以便在插入按钮 onClick 时将数据添加到 mysql 数据库中。到目前为止,这部分就像一个魅力,我可以将普通的 editText 值传递给字符串。我不知道如何将微调器中选择的文本传递给 BackgroundTask.java

public void insert(View view){
    pid = editPatientID.getText().toString();
    if(pid.equals(""))
    {
        Toast.makeText(this, "Please enter patient id!", Toast.LENGTH_LONG).show();
        return;
    }

    sgrcon = edit_sugar_con.getText().toString();
    if(sgrcon.equals(""))
    {
        Toast.makeText(this, "Please enter sugar concentration!", Toast.LENGTH_LONG).show();
        return;
    }
    date = btnSelectDate.getText().toString();


    measured = spinner.getSelectedItem().toString();

    String method = "save";
    BackgroundTask backgroundTask = new BackgroundTask(this);
    backgroundTask.execute(method,pid,sgrcon,date,measured);

}

我是编码和android开发的新手。非常感谢您的帮助!!

BackgroundTask.java:


    public class BackgroundTask extends AsyncTask<String,Void,String> {
        AlertDialog alertDialog;
        Context ctx;
        BackgroundTask(Context ctx)
        {
            this.ctx =ctx;
        }




        @Override
        protected void onPreExecute() {
            alertDialog = new AlertDialog.Builder(ctx).create();
            alertDialog.setTitle("");
        }





        @Override
        protected String doInBackground(String... params) {


            String save_url = "http://192.168.php";
            //String login_url = "http://10.0.2.2/webapp/login.php";
            String method = params[0];
            if (method.equals("save")) {
                String pid = params[1];
                String sgrcon = params[2];
                String date = params[3];

                try {
                    URL url = new URL(save_url);
                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                    httpURLConnection.setRequestMethod("POST");
                    httpURLConnection.setDoOutput(true);
                    //httpURLConnection.setDoInput(true);
                    OutputStream OS = httpURLConnection.getOutputStream();
                    BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(OS, "UTF-8"));
                    String data = URLEncoder.encode("pid", "UTF-8") + "=" + URLEncoder.encode(pid, "UTF-8") + "&" +
                            URLEncoder.encode("sgrcon", "UTF-8") + "=" + URLEncoder.encode(sgrcon, "UTF-8") + "&" +
                            URLEncoder.encode("date", "UTF-8") + "=" + URLEncoder.encode(date, "UTF-8")+
RLEncoder.encode("measured", "UTF-8") + "=" + URLEncoder.encode(measured, "UTF-8") +
                            URLEncoder.encode("time", "UTF-8") + "=" + URLEncoder.encode(date, "UTF-8");
                    bufferedWriter.write(data);
                    bufferedWriter.flush();
                    bufferedWriter.close();
                    OS.close();
                    InputStream IS = httpURLConnection.getInputStream();
                    IS.close();
                    //httpURLConnection.connect();
                    httpURLConnection.disconnect();
                    return "Data is added to patient's profile!!";
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

            return null;
        }
        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }
        @Override
        protected void onPostExecute(String result) {
            if(result.equals("Data is added to patient's profile!!"))
            {
                Toast.makeText(ctx, result, Toast.LENGTH_LONG).show();


            }
            else
            {
                alertDialog.setMessage(result);
                alertDialog.show();
            }
        }
    }

运行时出错:

01-15 10:34:46.657  14570-14570/com.example.rex.patient4 E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.rex.patient4, PID: 14570
    java.lang.IllegalStateException: Could not execute method for android:onClick
            at android.support.v7.internal.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:278)
            at android.view.View.performClick(View.java:4764)
            at android.view.View$PerformClick.run(View.java:19844)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5299)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.support.v7.internal.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:273)
            at android.view.View.performClick(View.java:4764)
            at android.view.View$PerformClick.run(View.java:19844)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5299)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.widget.Spinner.getSelectedItem()' on a null object reference
            at com.example.rex.patient4.AddBloodGlucoseRecord.insert(AddBloodGlucoseRecord.java:163)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.support.v7.internal.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:273)
            at android.view.View.performClick(View.java:4764)
            at android.view.View$PerformClick.run(View.java:19844)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5299)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
4

1 回答 1

0

将字符串声明selection为公共,然后将其传递给背景,就像您传递编辑文本字符串一样。

于 2016-01-13T05:57:05.870 回答