Reputation: 11
I made an android app that sends date to mysql. It was successful, then I tried making a tab widget. Both tabs contain the same code but are two different classes now after doing this the date picker dialog started to crash when activated.
What is the causes to this?
logcat report
02-03 16:32:15.797: E/AndroidRuntime(1445): FATAL EXCEPTION: main
02-03 16:32:15.797: E/AndroidRuntime(1445): android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@533459e0 is not valid; is your activity running?
02-03 16:32:15.797: E/AndroidRuntime(1445): at android.view.ViewRootImpl.setView(ViewRootImpl.java:567)
02-03 16:32:15.797: E/AndroidRuntime(1445): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:246)
02-03 16:32:15.797: E/AndroidRuntime(1445): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
02-03 16:32:15.797: E/AndroidRuntime(1445): at android.app.Dialog.show(Dialog.java:281)
02-03 16:32:15.797: E/AndroidRuntime(1445): at com.example.androidtablayout.VacLeave$2.onClick(VacLeave.java:129)
02-03 16:32:15.797: E/AndroidRuntime(1445): at android.view.View.performClick(View.java:4204)
02-03 16:32:15.797: E/AndroidRuntime(1445): at android.view.View$PerformClick.run(View.java:17355)
02-03 16:32:15.797: E/AndroidRuntime(1445): at android.os.Handler.handleCallback(Handler.java:725)
02-03 16:32:15.797: E/AndroidRuntime(1445): at android.os.Handler.dispatchMessage(Handler.java:92)
02-03 16:32:15.797: E/AndroidRuntime(1445): at android.os.Looper.loop(Looper.java:137)
02-03 16:32:15.797: E/AndroidRuntime(1445): at android.app.ActivityThread.main(ActivityThread.java:5041)
02-03 16:32:15.797: E/AndroidRuntime(1445): at java.lang.reflect.Method.invokeNative(Native Method)
02-03 16:32:15.797: E/AndroidRuntime(1445): at java.lang.reflect.Method.invoke(Method.java:511)
02-03 16:32:15.797: E/AndroidRuntime(1445): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-03 16:32:15.797: E/AndroidRuntime(1445): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-03 16:32:15.797: E/AndroidRuntime(1445): at dalvik.system.NativeStart.main(Native Method)
Code for datepicker VacLeave.java
public class VacLeave extends Activity implements OnClickListener {
Button btnCreateProduct;
ListView listView;
String[] trans;
// Session Manager Class
SessionManager session;
JSONParser jsonParser = new JSONParser();
ProgressDialog mProgressDialog;
JSONArray jsonarray;
EditText inputName;
String username;
EditText inputStart;
EditText inputEnd;
Button btnLogout;
Calendar myCalendar = Calendar.getInstance();
private String url = "http://10.0.3.2/sunshine-ems/vac.php";
private static final String TAG_SUCCESS = "success";
private static final String TAG_MESSAGE = "message";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.leave);
inputName = (EditText) findViewById(R.id.inputName);
inputStart = (EditText) findViewById(R.id.inputStart);
inputEnd = (EditText) findViewById(R.id.inputEnd);
btnCreateProduct = (Button) findViewById(R.id.btnCreateProduct);
inputStart.setOnClickListener(new OnClickListener() {
public void onClick(View view)
{
int mYear, mMonth, mDay;
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dpd = new DatePickerDialog(VacLeave.this,
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int month, int day) {
c.set(year, month, day);
String date = new SimpleDateFormat("yyyy/MM/dd").format(c.getTime());
inputStart.setText(date);
int mYear = c.get(Calendar.YEAR);
int mMonth = c.get(Calendar.MONTH);
int mDay = c.get(Calendar.DAY_OF_MONTH);
}
}, mYear, mMonth, mDay);
if(!((Activity) VacLeave.this).isFinishing())
{
dpd.show();
}
}
});
inputEnd.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
int mYear, mMonth, mDay;
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dpd = new DatePickerDialog(VacLeave.this,
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int month, int day) {
c.set(year, month, day);
String date = new SimpleDateFormat("yyyy/MM/dd").format(c.getTime());
inputEnd.setText(date);
int mYear = c.get(Calendar.YEAR);
int mMonth = c.get(Calendar.MONTH);
int mDay = c.get(Calendar.DAY_OF_MONTH);
}
}, mYear, mMonth, mDay);
if(!((Activity) VacLeave.this).isFinishing())
{
dpd.show();
}
}
});
// CHECK TO LOGIN SESSION
session = new SessionManager(getApplicationContext());
session.checkLogin();
btnLogout = (Button) findViewById(R.id.btnLogout);;
btnLogout.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
// Launching All products Activity
session.logoutUser();
Intent i = new Intent(getApplicationContext(), Login.class);
startActivity(i);
}
});
btnCreateProduct.setOnClickListener(this);
}
private class Submit extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Create a progressdialog
mProgressDialog = new ProgressDialog(VacLeave.this);
// Set progressdialog title
mProgressDialog.setTitle("Processing Leave request");
// Set progressdialog message
mProgressDialog.setMessage("Loading...");
mProgressDialog.setIndeterminate(false);
// Show progressdialog
mProgressDialog.show();
}
@Override
protected String doInBackground(String... args) {
int success;
Spinner mySpinner=(Spinner) findViewById(R.id.spinner);
username = session.getUsername();
List<NameValuePair> params1 = new ArrayList<NameValuePair>();
String reason = inputName.getText().toString();
String start = inputStart.getText().toString();
String end = inputEnd.getText().toString();
String status ="pending";
String leavetype="vacation";
//String leavetype = mySpinner.getSelectedItem().toString();
try {
params1.add(new BasicNameValuePair("reason", reason));
params1.add(new BasicNameValuePair("username", username));
params1.add(new BasicNameValuePair("start", start));
params1.add(new BasicNameValuePair("end", end));
params1.add(new BasicNameValuePair("leavetype", leavetype));
params1.add(new BasicNameValuePair("status", status));
Log.d("request!", "starting");
JSONObject json = jsonParser.makeHttpRequest(url, "POST",
params1);
// full json response
Log.d("Payment attempt", json.toString());
// json success element
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
return json.getString(TAG_MESSAGE);
} else {
Log.d("Login Failure!", json.getString(TAG_MESSAGE));
return json.getString(TAG_MESSAGE);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String file_url) {
// dismiss the dialog once product deleted
mProgressDialog.dismiss();
if (file_url != null) {
Toast.makeText(VacLeave.this, file_url, Toast.LENGTH_LONG).show();
}
}
}
/**
* Logout button click event
* */
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnCreateProduct:
if ( checkValidation () )
new Submit().execute();
else
Toast.makeText(VacLeave.this, "Required field(s)", Toast.LENGTH_LONG).show();
}
}
private boolean checkValidation() {
boolean ret = true;
if (!Validation.hasText(inputName)) ret = false;
if (!Validation.hasText(inputStart)) ret = false;
if (!Validation.hasText(inputEnd)) ret = false;
return ret;
}
}
Upvotes: 0
Views: 606
Reputation: 18112
It happens when the activity which is calling the dialog was finishing for some reason or another when it tried to show a dialog.
This is what you can do
Replace
dpd.show();
with
if(!((Activity) SickLeave.this).isFinishing())
{
dpd.show();
}
Upvotes: 1