简体   繁体   中英

http post not working in android app

I am new to android development. I am trying to create a application to scan the QR code string and post the same in web server. I am getting warning in error Method 'post' in 'MainActivity' has incorrect signature and also while clicking the post button I am getting error java.lang.IllegalStateException: Could not find method post(View) in a parent or ancestor Context for android:onClick attribute defined.

How to solve incorrect signature issue in method?

How to pass two variable in method?

public class MainActivity extends AppCompatActivity {

static final String ACTION_SCAN = "com.google.zxing.client.android.SCAN";
public String contents;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //set the main content layout of the Activity
    setContentView(R.layout.activity_main);
}

//product qr code mode
public void Scan(View v) {
    try {
        //start the scanning activity from the        com.google.zxing.client.android.SCAN intent
        Intent intent = new Intent(ACTION_SCAN);
        intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
        startActivityForResult(intent, 0);
    } catch (ActivityNotFoundException anfe) {
        //on catch, show the download dialog
        showDialog(MainActivity.this, "No Scanner Found", "Download a   scanner code activity?", "Yes", "No").show();
    }
}

//alert dialog for downloadDialog
private static AlertDialog showDialog(final Activity act, CharSequence  title, CharSequence message, CharSequence buttonYes, CharSequence buttonNo) {
        AlertDialog.Builder downloadDialog = new AlertDialog.Builder(act);
    downloadDialog.setTitle(title);
    downloadDialog.setMessage(message);
    downloadDialog.setPositiveButton(buttonYes, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialogInterface, int i) {
            Uri uri = Uri.parse("market://search?q=pname:" + "com.google.zxing.client.android");
            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            try {
                act.startActivity(intent);
            } catch (ActivityNotFoundException anfe) {

            }
        }
    });
    downloadDialog.setNegativeButton(buttonNo, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialogInterface, int i) {
        }
    });
    return downloadDialog.show();
}

public void onActivityResult(int requestCode, int resultCode, Intent intent)     {
    if (requestCode == 0) {
        if (resultCode == RESULT_OK) {
            String contents = intent.getStringExtra("SCAN_RESULT");

            EditText resultTxt = (EditText) findViewById(R.id.contents);
            resultTxt.setText(contents);
            resultTxt.setVisibility(View.VISIBLE);
        }

    }

 }

public void post(View view, Intent intent) {

                String contents = intent.getStringExtra("SCAN_RESULT");
                new JSONtask().execute(contents);

            }


    public class JSONtask extends AsyncTask<String, String, Void> {

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

      try {

            // 1. URL
            URL url = new URL("http://192.168.1.10:8080/SRNSmartLab/rest/service/storeNEdata");
            final String contents = params[0];
            // 2. Open connection
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            // 3. Specify POST method
            conn.setRequestMethod("POST");

            // 4. Set the headers
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setDoOutput(true);

            // 5. Add JSON data into POST request body


            //`5.1 Use Jackson object mapper to convert Contnet object into   JSON
            //ObjectMapper mapper = new ObjectMapper();

                // 5.2 Get connection output stream
               DataOutputStream wr = new DataOutputStream(conn.getOutputStream());

            // 5.3 Copy Content "JSON" into
           wr.writeBytes(contents);

            // 5.4 Send the request
            wr.flush();

            // 5.5 close
            wr.close();

            // 6. Get the response
            int responseCode = conn.getResponseCode();
            System.out.println("\nSending 'POST' request to URL : " + url);
            System.out.println("Response Code : " + responseCode);

            BufferedReader in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            // 7. Print result
            System.out.println(response.toString());

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

}

}

Here is layout code.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.lab.smart.smartlabinventry.MainActivity"
    tools:showIn="@layout/activity_main"
    android:background="#143de0">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/Scan"
        android:id="@+id/textView"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:textColor="#faf6f6"
    android:textSize="30sp"/>

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/Scan1"
        android:id="@+id/button"
        android:onClick="Scan"
        android:layout_above="@+id/spinner"
        android:layout_toRightOf="@+id/contents"
        android:layout_toEndOf="@+id/contents" />

    <Spinner
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/spinner"
        android:layout_centerVertical="true"
        android:layout_alignRight="@+id/button2"
        android:layout_alignEnd="@+id/button2" />
    <EditText
        android:id="@+id/contents"
        android:editable="false"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/spinner"
        android:textColor="#fdf9f9"
        android:layout_marginTop="15dp"
        android:visibility="gone"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/upload"
        android:id="@+id/button2"
        android:onClick="post"
        android:layout_alignTop="@+id/button"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>

Your error clearly defines your bug

java.lang.IllegalStateException: Could not find method post(View) in a parent or ancestor Context for android:onClick attribute defined.

You have called post() from button2 it will call post(View view) , you are expecting to call post(View view, Intent intent) .If you want to call post(View view, Intent intent) then add clicklistener of that button and call your method from that.

 btnPost.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { post(view,intent); } }); 

How exactly does the android:onClick XML attribute differ from setOnClickListener?

review the answer above and go to your statement

 public void post(View view, Intent intent) {

remove the 2nd arg from the method signature and at least that one error will resolve

No, you cannot have two parameters for an OnClickListener.

In order to fix your issue, just store the scan results as a member variable, which you already have:

public String contents;

Then, in onActivityResult, set the result to the member variable instead of a local variable:

  public void onActivityResult(int requestCode, int resultCode, Intent intent)     {
    if (requestCode == 0) {
        if (resultCode == RESULT_OK) {
             //modified:
            contents = intent.getStringExtra("SCAN_RESULT");

            EditText resultTxt = (EditText) findViewById(R.id.contents);
            resultTxt.setText(contents);
            resultTxt.setVisibility(View.VISIBLE);
        }

    }

 }

Then, in the post() method, just make sure that contents is not null:

        public void post(View view) {

            if (contents != null) {
                new JSONtask().execute(contents);
            }

        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM