http帖子在android app

时间:2015-12-29 14:48:51

标签: java android android-intent

我是Android开发的新手。我正在尝试创建一个应用程序来扫描QR代码字符串并在Web服务器中发布它。我收到错误的警告'MainActivity'中的方法'post'有不正确的签名,并且在点击post按钮时我收到错误java.lang.IllegalStateException:找不到父或祖先的方法post(View)Context for android :onClick属性已定义。

如何解决方法中错误的签名问题?

如何在方法中传递两个变量?

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

}

}

这是布局代码。

<?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>

3 个答案:

答案 0 :(得分:1)

您的错误明确定义了您的错误

  

java.lang.IllegalStateException:在父级或祖先的上下文中找不到方法post(View)for android:onClick attribute defined。

您已致电post()来自button2,它会致电post(View view),您希望致电post(View view, Intent intent)。如果您想致电post(View view, Intent intent),请添加clicklistener该按钮并从中调用您的方法。

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

答案 1 :(得分:0)

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

查看上面的答案并转到你的陈述

 public void post(View view, Intent intent) {

从方法签名中删除第二个arg,至少会解决一个错误

答案 2 :(得分:0)

不,OnClickListener不能有两个参数。

为了解决您的问题,只需将扫描结果存储为您已有的成员变量:

public String contents;

然后,在onActivityResult中,将结果设置为成员变量而不是局部变量:

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

    }

 }

然后,在post()方法中,只需确保contents不为null:

        public void post(View view) {

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

        }