我是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>
答案 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该按钮并从中调用您的方法。
btnPost.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
post(view,intent);
}
});
&#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);
}
}