2015-09-13 153 views
1

我是Android Studio的新手。 我遵循Youtube和Google错误教程,但是这次我似乎找不到如何解决这个问题。Android Studio,应用程序停止工作

我创建了一个简单的登录和注册应用程序,它使用了一个mysql数据库。当我启动应用程序并点击注册按钮时,应用程序关闭并指出:“应用程序停止工作”。

我检查了logcat的,发现这个:

09-13 17:23:19.607 2229-2236/com.example.appname.appname E/art﹕ Failed sending reply to debugger: Broken pipe 
09-13 17:23:47.756 2229-2229/com.example.appname.appname E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.appname.appname, PID: 2229 
    java.lang.IllegalStateException: Could not find method userReg(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.widget.Button 
      at android.view.View$DeclaredOnClickListener.resolveMethod(View.java:4479) 
      at android.view.View$DeclaredOnClickListener.onClick(View.java:4443) 
      at android.view.View.performClick(View.java:5198) 
      at android.view.View$PerformClick.run(View.java:21147) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:148) 
      at android.app.ActivityThread.main(ActivityThread.java:5417) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Mainactivity.java

import android.app.Activity; 
import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
public void userReg() 
{ 
    startActivity(new Intent(this, Register.class)); 
} 
    public void userLogin(View view) 
    { 


    } 


} 

Register.java

import android.app.Activity; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.EditText; 

public class Register extends Activity { 
    EditText ET_NAME,ET_USER_NAME,ET_USER_PASS; 
    String name,user_name,user_pass; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.register_layout); 
     ET_NAME = (EditText) findViewById(R.id.name); 
     ET_USER_NAME = (EditText) findViewById(R.id.new_user_name); 
     ET_USER_PASS = (EditText) findViewById(R.id.new_user_pass); 
    } 

    public void userReg(View view) 
    { 
     name = ET_NAME.getText().toString(); 
     user_name = ET_USER_NAME.getText().toString(); 
     user_pass = ET_USER_PASS.getText().toString(); 
     String method = "register"; 
     BackgroundTask backgroundTask = new BackgroundTask(this); 
     backgroundTask.execute(method,name,user_name,user_pass); 
     finish(); 
    } 
} 

Backgroundtask.java

import android.content.Context; 
import android.os.AsyncTask; 
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; 

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

    } 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     String reg_url = "http://10.0.2.2.2/webapp/register.php"; 
     String login_url = "http://10.0.2.2.2/webapp/login.php"; 
     String method = params[0]; 
     if(method.equals("register")) 
     { 
     String name = params [1]; 
      String user_name = params[2]; 
      String user_pass = params[3]; 
      try { 
       URL url = new URL(reg_url); 
       HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); 
       httpURLConnection.setRequestMethod("POST"); 
       httpURLConnection.setDoOutput(true); 
       OutputStream OS = httpURLConnection.getOutputStream(); 
       BufferedWriter bufferedWriter = new BufferedWriter (new OutputStreamWriter(OS, "UTF-8")); 
      String data = URLEncoder.encode("user", "UTF-8") +"=" +URLEncoder.encode(name, "UTF-8") + "&"+ 
        URLEncoder.encode("user_name", "UTF-8") +"=" +URLEncoder.encode(user_name, "UTF-8") + "&"+ 
        URLEncoder.encode("user_pass", "UTF-8") +"=" +URLEncoder.encode(user_pass, "UTF-8"); 
       bufferedWriter.write(data); 
       bufferedWriter.flush(); 
       bufferedWriter.close(); 
       OS.close(); 
       InputStream IS = httpURLConnection.getInputStream(); 
       IS.close(); 
       return "Registration Success.."; 
      } 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) { 
     Toast.makeText(ctx,result,Toast.LENGTH_LONG).show(); 
    } 
} 
+0

哪里是你的onclick代码? –

回答

-1

java.lang.IllegalStateException: Could not find method userReg(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.widget.Button

如果您使用onclick方法,则需要将参数View v传递给它。

public void userReg() 
{ 
    startActivity(new Intent(this, Register.class)); 
} 

像这样:

public void userReg(View v) 
+0

感谢您的帮助。我改变了它,按钮现在工作。 – Rob12

+0

但是,当我填写登记表上的姓名,用户名和密码并点击注册按钮。我得到另一个错误:09-14 09:21:33.810 2208-2225/com.example.appname.appname E/Surface:getSlotFromBufferLocked:unknown buffer:0xab7d36f0 09-14 09:21:36.838 2208-2225/com。 example.appname.appname E/Surface:getSlotFromBufferLocked:未知的缓冲区:0xab7d3760 – Rob12

+0

@ Rob12这是回答你的第一个问题,请接受它作为答案,并写一个新的问题,并在这里发布一个链接,我会帮你。 –

0

改变你Mainactivity.java

public void userReg() 
{ 
    startActivity(new Intent(this, Register.class)); 
} 

public void userReg(View v) 
{ 
    startActivity(new Intent(Mainactivity.this, Register.class)); 
} 

而且在Register.java

public void userReg(View view) 
{ 
    name = ET_NAME.getText().toString(); 
    user_name = ET_USER_NAME.getText().toString(); 
    user_pass = ET_USER_PASS.getText().toString(); 
    String method = "register"; 
    BackgroundTask backgroundTask = new BackgroundTask(this); 
    backgroundTask.execute(method,name,user_name,user_pass); 
    finish(); 
} 

public void userReg(View view) 
{ 
    name = ET_NAME.getText().toString(); 
    user_name = ET_USER_NAME.getText().toString(); 
    user_pass = ET_USER_PASS.getText().toString(); 
    String method = "register"; 
    BackgroundTask backgroundTask = new BackgroundTask(Register.this); 
    backgroundTask.execute(method,name,user_name,user_pass); 
    finish(); 
} 
+0

又是什么?这是更安全的选择,因为如果他想在将来从中听取问题,他可以避免问题。 –

0

错误出现,因为该应用程序找不到这是写在你的XML按钮的onclick属性用户注册(查看)方法。你需要在你的方法中添加参数“View”。简单地修复这些代码行:

MainActivity.java

public void userReg() { 
    startActivity(new Intent(this, Register.class)); 
} 

public void userReg(View v) { 
    startActivity(new Intent(MainActivity.this, Register.class)); 
} 
+0

反正它没有区别。 –