I will preface this by saying I am a complete newb, this is my first project, and I have tried searching everywhere to answer my question.
I have a login screen set up on android. Once the user hits the login button and the login name/password are correct, (validated in PHP/SQL) it sends an intent/bundle to the next activity.
Here is the code to send the intent/bundle:
Intent intent = new Intent(this, Homepage.class);
EditText uname2 = (EditText)findViewById(R.id.txt_username);
String username2 = uname2.getText().toString();
Intent intent2 = new Intent(this, Homepage.class);
intent2.putExtra("username2", username2);
startActivity(intent);
Here is the code to receive the intent bundle on the next activity:
Intent intent2 = getIntent();
String usernamefromlogin = intent2.getExtras().getString("username2");
String url5 = url.concat(usernamefromlogin);
TextView text = (TextView) findViewById(R.id.errorchecking);
text.setText(url5);
I am using concat() to put a URL before the intent bundle because that URL is going to be used as a _GET command to a PHP file (but I digress). Currently, I have it set to place the text into a TextView so that I can see what the end result is, but the app crashes before I can get to that point.
My app crashes when I hit the login button. Here is the Logcat I am getting:
11-30 20:06:39.449: E/AndroidRuntime(4578): FATAL EXCEPTION: main
11-30 20:06:39.449: E/AndroidRuntime(4578): Process: com.sencide, PID: 4578
11-30 20:06:39.449: E/AndroidRuntime(4578): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sencide/com.sencide.Homepage}: java.lang.NullPointerException
11-30 20:06:39.449: E/AndroidRuntime(4578): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
11-30 20:06:39.449: E/AndroidRuntime(4578): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
11-30 20:06:39.449: E/AndroidRuntime(4578): at android.app.ActivityThread.access$700(ActivityThread.java:135)
11-30 20:06:39.449: E/AndroidRuntime(4578): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
11-30 20:06:39.449: E/AndroidRuntime(4578): at android.os.Handler.dispatchMessage(Handler.java:102)
11-30 20:06:39.449: E/AndroidRuntime(4578): at android.os.Looper.loop(Looper.java:137)
11-30 20:06:39.449: E/AndroidRuntime(4578): at android.app.ActivityThread.main(ActivityThread.java:4998)
11-30 20:06:39.449: E/AndroidRuntime(4578): at java.lang.reflect.Method.invokeNative(Native Method)
11-30 20:06:39.449: E/AndroidRuntime(4578): at java.lang.reflect.Method.invoke(Method.java:515)
11-30 20:06:39.449: E/AndroidRuntime(4578): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
11-30 20:06:39.449: E/AndroidRuntime(4578): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
11-30 20:06:39.449: E/AndroidRuntime(4578): at dalvik.system.NativeStart.main(Native Method)
11-30 20:06:39.449: E/AndroidRuntime(4578): Caused by: java.lang.NullPointerException
11-30 20:06:39.449: E/AndroidRuntime(4578): at com.sencide.Homepage.onCreate(Homepage.java:46)
11-30 20:06:39.449: E/AndroidRuntime(4578): at android.app.Activity.performCreate(Activity.java:5243)
11-30 20:06:39.449: E/AndroidRuntime(4578): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
11-30 20:06:39.449: E/AndroidRuntime(4578): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
11-30 20:06:39.449: E/AndroidRuntime(4578): ... 11 more
11-30 20:06:42.569: I/Process(4578): Sending signal. PID: 4578 SIG: 9
Here is my entire code:
AndroidLogin.java
public class AndroidLogin extends Activity implements OnClickListener {
Button ok,back,exit;
TextView result;
String thisisausername;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Login button clicked
ok = (Button)findViewById(R.id.btn_login);
ok.setOnClickListener(this);
result = (TextView)findViewById(R.id.tbl_result);
}
public void postLoginData() {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
// login.php returns true if username and password match in db
HttpPost httppost = new HttpPost("http://10.0.2.2/login.php");
try {
// Add user name and password
EditText uname = (EditText)findViewById(R.id.txt_username);
String username = uname.getText().toString();
EditText pword = (EditText)findViewById(R.id.txt_password);
String password = pword.getText().toString();
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("username", username));
nameValuePairs.add(new BasicNameValuePair("password", password));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
Log.w("SENCIDE", "Execute HTTP Post Request");
HttpResponse response = httpclient.execute(httppost);
String str = inputStreamToString(response.getEntity().getContent()).toString();
Log.w("SENCIDE", str);
if(str.toString().equalsIgnoreCase("true"))
{
Log.w("SENCIDE", "TRUE");
result.setText("Login Successful! Please Wait...");
}else
{
Log.w("SENCIDE", "FALSE");
result.setText(str);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private StringBuilder inputStreamToString(InputStream is) {
String line = "";
StringBuilder total = new StringBuilder();
// Wrap a BufferedReader around the InputStream
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
// Read response until the end
try {
while ((line = rd.readLine()) != null) {
total.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
// Return full string
return total;
}
public void RegisterButton(View view) {
String url = "http://10.0.2.2/register.php";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
}
@Override
public void onClick(View view) {
postLoginData();
// turns the text in the textview "Tbl_result" into a text string called "tblresult"
TextView tblresult = (TextView) findViewById(R.id.tbl_result);
// If "tblresult" text string matches the string "Login Successful! Please Wait..." exactly, it will switch to next activity
if (tblresult.getText().toString().equals("Login Successful! Please Wait...")) {
Intent intent = new Intent(this, Homepage.class);
EditText uname2 = (EditText)findViewById(R.id.txt_username);
String username2 = uname2.getText().toString();
intent.putExtra("username2", username2);
startActivity(intent);
}
}
}
Homepage.Java
public class Homepage extends Activity {
//URL to get JSON Arrays
public static String url = "http://x.x.x.x/SQL.php?username=123";
//JSON Node Names
private static final String TAG_USER = "users";
private static final String TAG_ID = "uid";
private static final String TAG_NAME = "fullname";
private static final String TAG_DISPLAY = "displayname";
private static final String TAG_EMAIL = "email";
private static final String TAG_PW = "password";
private static final String TAG_CREATED = "created_at";
private static final String TAG_UPDATED = "updated_at";
JSONArray user = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Get login name from EditText in login screen and concatenate it to PHP user-name for _GET
Intent intent2 = getIntent();
String usernamefromlogin = intent2.getExtras().getString("username2");
String url5 = url.concat(usernamefromlogin);
TextView text = (TextView) findViewById(R.id.errorchecking);
text.setText(url5);
setContentView(R.layout.reshomepage);
// Creating new JSON Parser
JSONParser jParser = new JSONParser();
// Getting JSON from URL
JSONObject json = jParser.getJSONFromUrl(url);
try {
// Getting JSON Array
user = json.getJSONArray(TAG_USER);
JSONObject c = user.getJSONObject(0);
// Storing JSON item in a Variable
String uid = c.getString(TAG_ID);
String name = c.getString(TAG_NAME);
String display = c.getString(TAG_DISPLAY);
String email = c.getString(TAG_EMAIL);
String pw = c.getString(TAG_PW);
String created = c.getString(TAG_CREATED);
String updated = c.getString(TAG_UPDATED);
//Importing TextView
final TextView uid1 = (TextView)findViewById(R.id.tvuid);
final TextView name1 = (TextView)findViewById(R.id.tvfullname);
final TextView display1 = (TextView)findViewById(R.id.tvdisplayname);
final TextView email1 = (TextView)findViewById(R.id.tvemail);
final TextView pw1 = (TextView)findViewById(R.id.tvpassword);
final TextView created1 = (TextView)findViewById(R.id.tvcreated_at);
final TextView updated1 = (TextView)findViewById(R.id.tvupdated_at);
//Set JSON Data in TextView
uid1.setText(uid);
name1.setText(name);
display1.setText(display);
email1.setText(email);
pw1.setText(pw);
created1.setText(created);
updated1.setText(updated);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
JSONParser.java
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
public JSONObject getJSONFromUrl(String url) {
// Making HTTP request
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;
}
}
Main.XML (first login screen)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- Text at Top !-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/lbl_top"
android:textSize="16sp"
android:typeface="sans"
android:text="Please Login"
/>
<!-- Username Text Above Field !-->
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/lbl_username"
android:text="User Name (e-mail)"
/>
<!-- Username Field !-->
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:id="@+id/txt_username"
/>
<!-- Password Text Above Field !-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/lbl_password"
android:text="Password"
/>
<!-- Password Field !-->
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:password="true"
android:id="@+id/txt_password"
/>
<!-- Login Button !-->
<Button
android:layout_width="match_parent"
android:layout_height="35dp"
android:id="@+id/btn_login"
android:text="Login"
android:onClick="LoginScreenButton"
/>
<!-- Register Button !-->
<Button
android:layout_width="match_parent"
android:layout_height="35dp"
android:id="@+id/register"
android:text="New Registration"
android:onClick="RegisterButton"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tbl_result"
android:textColor="#00FF00"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tbl_result2"
android:textColor="#00FF00"
/>
</LinearLayout>
reshomepage.XML (second screen where I am trying to send intent to)
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:id="@+id/tvuid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/tvfullname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/tvdisplayname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/tvemail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/tvpassword"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/tvcreated_at"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/tvupdated_at"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/errorchecking"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
The problem here is You creade 2 intents (intent and intent2) and then saved the username in intent2, but startActivity(intent) is being called.
So basically, remove one of the intents and your code should look something like this:
Intent intent = new Intent(this, Homepage.class);
EditText uname2 = (EditText)findViewById(R.id.txt_username);
String username2 = uname2.getText().toString();
intent.putExtra("username2", username2);
startActivity(intent);
Let me know how this goes
The problem here is that you've attached the username2 extra to intent2, but you dont use intent2.
You start your activity and then look for the extra 'username2' in the incoming intent, since the intent you sent didn't contain the extra 'username2' you get usernamefromlogin assigned a value of null, and causing the null pointer exception you see in your stack trace.
Just get rid of the second intent, and place your string extra in the one that you use when starting the activity:
Intent intent = new Intent(this, Homepage.class);
EditText uname2 = (EditText)findViewById(R.id.txt_username);
String username2 = uname2.getText().toString();
intent.putExtra("username2", username2);
startActivity(intent);
For the sake of safety, maybe make sure the intent HAS the extra before you run off and use it.
Intent intent = getIntent();
if (intent.hasExtra("username2") {
String usernamefromlogin = intent.getExtras().getString("username2");
String url5 = url.concat(usernamefromlogin);
TextView text = (TextView) findViewById(R.id.errorchecking);
text.setText(url5);
} else {
// ...appropriate error handling goes here!
}
good luck!
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.