我完全是Android应用程序开发的初学者。所以我决定去一个简单的应用程序(Signin / SignUp)。我当然不知道是什么原因导致错误所以这里是完整的代码。当我点击注册或登录按钮导致“不幸的应用程序停止运行错误”。 Plz任何人指出我正确的方向。
MainActivity.java
package com.example.kyokesh.ams1;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
EditText email,password;
Button signup, signin;
SQLiteDatabase db;
Cursor c;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
email = (EditText) findViewById(R.id.ETemail);
password = (EditText) findViewById(R.id.ETpassword);
signin = (Button) findViewById(R.id.Bsignin);
signup = (Button) findViewById(R.id.Bsignup);
signup.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, Signup.class);
startActivity(intent);
}
});
signin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
String s1 = email.getText().toString();
String s2 = password.getText().toString();
db = openOrCreateDatabase("mydatabase.db", MODE_PRIVATE, null);
c = db.rawQuery("select name from UserData where password ='" + s2 + "' && email='"+s1+"'",null);
if (c.getCount() == 0) {
Toast.makeText(getApplicationContext(), "Login Successful", Toast.LENGTH_SHORT).show();
c.close();
db.close();
Intent i1 = new Intent(MainActivity.this, Signup.class);
startActivity(i1);
}
}
});
}}
Signup.java
package com.example.kyokesh.ams1;
import android.app.Activity;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.Objects;
public class Signup extends Activity {
EditText name,email,password,cpassword;
Button register;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signup);
name = (EditText) findViewById(R.id.ETname);
email = (EditText) findViewById(R.id.ETemail);
password = (EditText) findViewById(R.id.ETpassword);
cpassword = (EditText) findViewById(R.id.ETcpassword);
final String s1 = name.getText().toString();
final String s2 = email.getText().toString();
final String s3 = password.getText().toString();
final String s4 = cpassword.getText().toString();
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
db = openOrCreateDatabase("mydatabse.db", MODE_PRIVATE, null);
if (Objects.equals(s1, s2)) {
db.execSQL("create table if not exists UserData(name varchar,email varchar,password varchar,cpassword varchar);");
db.execSQL("insert into UserData '" + s1 + "','" + s2 + "','" + s3 + "','" + s4 + "');");
Toast.makeText(getApplicationContext(), "Sign Up Successful", Toast.LENGTH_SHORT).show();
Intent main = new Intent(Signup.this, MainActivity.class);
} else {
Toast.makeText(getApplicationContext(), "Password doesn't match confirmation", Toast.LENGTH_SHORT).show();
Intent intent = getIntent();
finish();
startActivity(intent);
}
}
});
}
}
XML
content_main.xml
<?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.example.kyokesh.ams1.MainActivity"
tools:showIn="@layout/activity_main">
<RelativeLayout
tools:context="com.example.kyokesh.ams.MainActivity"
tools:showIn="@layout/activity_main"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
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"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true">
<Button
android:layout_width="176dp"
android:layout_height="wrap_content"
android:text="Sign In"
android:id="@+id/Bsignin"
android:layout_marginTop="45dp"
android:backgroundTint="#1e88e5"
android:clickable="false"
android:layout_below="@+id/ETpassword"
android:layout_centerHorizontal="true"
android:nestedScrollingEnabled="false" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress"
android:ems="10"
android:id="@+id/ETemail"
android:text="E-mail"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginTop="49dp" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:ems="10"
android:id="@+id/ETpassword"
android:text="Password"
android:layout_below="@+id/ETemail"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<Button
android:layout_width="176dp"
android:layout_height="wrap_content"
android:text="New? Sign Up here"
android:id="@+id/Bsignup"
android:backgroundTint="#1e88e5"
android:clickable="false"
android:onClick="onSignUpClick"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
</RelativeLayout>
content_signup.xml
<?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.example.kyokesh.ams1.Signup"
tools:showIn="@layout/activity_signup">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Name"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:ems="10"
android:id="@+id/ETname"
android:layout_alignParentEnd="true"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="E-mail"
android:id="@+id/textView2"
android:layout_alignParentStart="true"
android:layout_below="@+id/ETname"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress"
android:ems="10"
android:id="@+id/ETemail"
android:layout_alignParentStart="true"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Password"
android:id="@+id/textView3"
android:layout_alignParentStart="true"
android:layout_below="@+id/ETemail"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:ems="10"
android:id="@+id/ETpassword"
android:layout_alignParentStart="true"
android:layout_below="@+id/textView3"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Confirm Password"
android:id="@+id/textView4"
android:layout_alignParentStart="true"
android:layout_below="@+id/ETpassword"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:ems="10"
android:id="@+id/ETcpassword"
android:layout_alignParentStart="true"
android:layout_below="@+id/textView4"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="176dp"
android:layout_height="wrap_content"
android:text="Register"
android:id="@+id/button"
android:backgroundTint="#1e88e5"
android:clickable="false"
android:onClick="onSignUpClick"
android:layout_below="@+id/ETcpassword"
android:layout_centerHorizontal="true" />
</RelativeLayout>
Logcat错误日志:
08-24 09:05:44.393 6017-6017/? I/art: Not late-enabling -Xcheck:jni (already on)
08-24 09:05:44.462 6017-6017/? I/art: Late-enabling JIT
08-24 09:05:44.501 6017-6017/? I/art: JIT created with code_cache_capacity=2MB compile_threshold=1000
08-24 09:05:44.720 6017-6017/com.example.kyokesh.ams1 W/System: ClassLoader referenced unknown path: /data/app/com.example.kyokesh.ams1-1/lib/x86
08-24 09:05:44.987 6017-6028/com.example.kyokesh.ams1 W/art: Suspending all threads took: 14.435ms
08-24 09:05:44.994 6017-6028/com.example.kyokesh.ams1 I/art: Background sticky concurrent mark sweep GC freed 11075(515KB) AllocSpace objects, 0(0B) LOS objects, 72% free, 682KB/2MB, paused 16.779ms total 142.291ms
08-24 09:05:45.037 6017-6039/com.example.kyokesh.ams1 D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
08-24 09:05:45.093 6017-6039/com.example.kyokesh.ams1 I/OpenGLRenderer: Initialized EGL, version 1.4
08-24 09:05:45.159 6017-6039/com.example.kyokesh.ams1 W/EGL_emulation: eglSurfaceAttrib not implemented
08-24 09:05:45.159 6017-6039/com.example.kyokesh.ams1 W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xad924be0, error=EGL_SUCCESS
08-24 09:05:46.282 6017-6017/com.example.kyokesh.ams1 D/AndroidRuntime: Shutting down VM
08-24 09:05:46.282 6017-6017/com.example.kyokesh.ams1 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.kyokesh.ams1, PID: 6017
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.kyokesh.ams1/com.example.kyokesh.ams1.Signup}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
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)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.example.kyokesh.ams1.Signup.onCreate(Signup.java:34)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
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)
08-24 09:05:48.300 6017-6017/com.example.kyokesh.ams1 I/Process: Sending signal. PID: 6017 SIG: 9
答案 0 :(得分:1)
至少对于您的SignUp
活动,您应该获得空指针异常,因为您尚未初始化register
按钮并且仍然在对象上调用setOnClickListener
。您可以在调用setOnClickListener
之前添加此行来修复它:
register = (Button) findViewById(R.id.button);
答案 1 :(得分:0)
根据错误日志
引起:java.lang.NullPointerException:尝试调用虚拟 方法'无效 android.widget.Button.setOnClickListener(android.view.View $ OnClickListener)” 在空对象引用上
您正在设置,
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
没有类型转换注册按钮。要解决此问题,请初始化按钮
register = (Button) findViewById(R.id.Bsignin);
在向其添加 setOnClickListener()之前。
关于下一个问题,要在成功登录时转到下一个活动,请更改以下代码,
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
db = openOrCreateDatabase("mydatabse.db", MODE_PRIVATE, null);
if (Objects.equals(s1, s2)) {
db.execSQL("create table if not exists UserData(name varchar,email varchar,password varchar,cpassword varchar);");
db.execSQL("insert into UserData '" + s1 + "','" + s2 + "','" + s3 + "','" + s4 + "');");
Toast.makeText(getApplicationContext(), "Sign Up Successful", Toast.LENGTH_SHORT).show();
Intent main = new Intent(Signup.this,MainActivity.class);
startActivity(main);
finish();
} else {
Toast.makeText(getApplicationContext(), "Password doesn't match confirmation", Toast.LENGTH_SHORT).show();
}
}
});