Reputation: 3912
I'm trying to add a child activity using
TabGroupActivity parentActivity = (TabGroupActivity) getParent();
parentActivity.startChildActivity("AlbumDetailsLatest2", i);
but seems I'm getting an error that I cannot understand what seems to be the problem.
Here is my LatestAlbums activity class:
public class LatestAlbums extends FragmentActivity {
// widgets
private ListView list;
private ImageView back, clear;
private EditText find;
// JSON Node names
private static final String TAG_ALBUMS = "albums";
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_SINGER = "singer";
private static final String TAG_GENRE = "genre";
private static final String TAG_MIX = "mix";
private static final String TAG_THUMB = "thumb";
private static final String TAG_SONGS = "songs";
private static final String TAG_SONG_TITLE = "song";
private static final String TAG_SONG_ARTIST = "artist";
private static final String TAG_SONG_MP3 = "mp3";
private static final String TAG_SONG_MP4 = "mp4";
private static final String TAG_SONG_THUMB = "thumb";
private Parcelable state;
private ProgressDialog pdialog;
// albums JSONArray
private JSONArray albums;
private JSONArray sngs;
// arrayLists for creating objects
private ArrayList<Albums> albumsArray;
private ArrayList<Songs> songsArray;
private AlbumLazyAdapter adapter;
private ViewPager pager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.latest_albums);
albumsArray = new ArrayList<Albums>();
songsArray = new ArrayList<Songs>();
try {
loadJSON();
} catch (JSONException e) {
e.printStackTrace();
}
}
private void initWidgets() {
list = (ListView) findViewById(R.id.listView1);
back = (ImageView) findViewById(R.id.latest_back_img);
clear = (ImageView) findViewById(R.id.latest_search_clear);
pager = (ViewPager) findViewById(R.id.my_slider);
clear.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
find.setText("");
find.clearFocus();
find.clearComposingText();
clear.setVisibility(View.INVISIBLE);
}
});
find = (EditText) findViewById(R.id.latest_search_et);
back.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
adapter = new AlbumLazyAdapter(this, albumsArray);
// set list view adapter
list.setAdapter(adapter);
// setting find edit text searching method
find.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
clear.setVisibility(View.VISIBLE);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
final ArrayList<Albums> temp = new ArrayList<Albums>();
for (int i = 0; i < albumsArray.size(); i++) {
if (albumsArray.get(i).getTAG_NAME().toLowerCase()
.contains(find.getText().toString().toLowerCase())
|| albumsArray.get(i).getTAG_SINGER().toLowerCase()
.contains(find.getText().toString())) {
temp.add(albumsArray.get(i));
}
}
AlbumLazyAdapter mAdapter = new AlbumLazyAdapter(
LatestAlbums.this, temp);
list.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v,
int position, long arg3) {
Intent i = new Intent();
i.putExtra("albums", temp.get(position));
i.putExtra("songs", temp.get(position).getSongs());
i.putExtra("title", temp.get(position).getTAG_NAME());
i.putExtra("genre", temp.get(position).getTAG_GENRE());
i.putExtra("thumb", temp.get(position).getTAG_THUMB());
i.setClass(LatestAlbums.this, AlbumDetails.class);
TabGroupActivity parentActivity = (TabGroupActivity) getParent();
parentActivity.startChildActivity("AlbumDetailsLatest1", i);
}
});
}
});
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v,
int position, long arg3) {
Intent i = new Intent();
i.putExtra("albums", albumsArray.get(position));
i.putExtra("songs", albumsArray.get(position).getSongs());
i.putExtra("title", albumsArray.get(position).getTAG_NAME());
i.putExtra("genre", albumsArray.get(position).getTAG_GENRE());
i.putExtra("thumb", albumsArray.get(position).getTAG_THUMB());
i.setClass(LatestAlbums.this, AlbumDetails.class);
TabGroupActivity parentActivity = (TabGroupActivity) getParent();
parentActivity.startChildActivity("AlbumDetailsLatest2", i);
}
});
}
@Override
protected void onResume() {
super.onResume();
initWidgets();
}
// load json from server via asyncTask
public void loadJSON() throws JSONException {
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
initWidgets();
pdialog = new ProgressDialog(LatestAlbums.this);
pdialog.setMessage(getString(R.string.loading_));
pdialog.show();
pdialog.setCancelable(true);
pdialog.setCanceledOnTouchOutside(false);
}
@Override
protected Void doInBackground(Void... params) {
if (isOnline()) {
JSONObject json = new JSONParser()
.getJSONFromUrl(getString(R.string.json_URL));
JSONObject theJSON;
try {
// Getting Array of albums
theJSON = json.getJSONObject("json");
albums = theJSON.getJSONArray(TAG_ALBUMS);
// looping through All albums
for (int i = 0; i < albums.length(); i++) {
JSONObject c = albums.getJSONObject(i);
String album_id = c.getString(TAG_ID);
String album_name = c.getString(TAG_NAME);
String album_singer = c.getString(TAG_SINGER);
String album_mix = c.getString(TAG_MIX);
String album_genre = c.getString(TAG_GENRE);
String album_thumb = getString(R.string.cover_URL)
+ c.getString(TAG_THUMB);
albumsArray.add(new Albums(album_id, album_name,
album_singer, album_genre, album_mix,
album_thumb, songsArray));
sngs = c.getJSONArray(TAG_SONGS);
// getting songs for the album
songsArray = new ArrayList<Songs>();
for (int j = 0; j < sngs.length(); j++) {
JSONObject songs = sngs.getJSONObject(j);
String song_artist = songs
.getString(TAG_SONG_ARTIST);
String song_mp3 = songs.getString(TAG_SONG_MP3);
String song_mp4 = songs.getString(TAG_SONG_MP4);
String song_thumb = songs
.getString(TAG_SONG_THUMB);
String song_title = songs
.getString(TAG_SONG_TITLE);
songsArray.add(new Songs(song_title,
song_artist,
"http://someurl.com/musica/songs_with/"
+ song_mp3, song_mp4,
getString(R.string.cover_URL)
+ song_thumb));
}
albumsArray.get(i).setSongs(songsArray);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.latest_relativeLayout);
TextView noCon = new TextView(LatestAlbums.this);
noCon.setText(R.string.not_connected_to_internet);
noCon.setPadding(100, 200, 100, 0);
noCon.setTextSize(22);
noCon.setTextColor(Color.WHITE);
relativeLayout.addView(noCon);
ImageView left = (ImageView) findViewById(R.id.latest_left);
left.setVisibility(View.GONE);
ImageView right = (ImageView) findViewById(R.id.latest_right);
right.setVisibility(View.GONE);
pager.setVisibility(View.GONE);
find.setVisibility(View.GONE);
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
pdialog.dismiss();
FragmentManager fm = getSupportFragmentManager();
MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(
fm, albumsArray);
pager.setAdapter(pagerAdapter);
adapter.notifyDataSetChanged();
}
};
task.execute();
}
public void saveState() {
state = list.onSaveInstanceState();
}
public boolean isOnline() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
return false;
}
public void reload() {
saveState();
list.setAdapter(adapter);
list.onRestoreInstanceState(state);
}
}
Here is the logCat output:
04-11 11:48:39.057: E/AndroidRuntime(3573): FATAL EXCEPTION: main
04-11 11:48:39.057: E/AndroidRuntime(3573): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.activities.TabLayouts}: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.activities.LatestGroup}: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.activities.LatestAlbums}: android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@4198bfe8 is not valid; is your activity running?
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1972)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1997)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.ActivityThread.access$600(ActivityThread.java:124)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1148)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.os.Handler.dispatchMessage(Handler.java:99)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.os.Looper.loop(Looper.java:137)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.ActivityThread.main(ActivityThread.java:4440)
04-11 11:48:39.057: E/AndroidRuntime(3573): at java.lang.reflect.Method.invokeNative(Native Method)
04-11 11:48:39.057: E/AndroidRuntime(3573): at java.lang.reflect.Method.invoke(Method.java:511)
04-11 11:48:39.057: E/AndroidRuntime(3573): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
04-11 11:48:39.057: E/AndroidRuntime(3573): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
04-11 11:48:39.057: E/AndroidRuntime(3573): at dalvik.system.NativeStart.main(Native Method)
04-11 11:48:39.057: E/AndroidRuntime(3573): Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.activities.LatestGroup}: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.activities.LatestAlbums}: android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@4198bfe8 is not valid; is your activity running?
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1972)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.ActivityThread.startActivityNow(ActivityThread.java:1813)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:682)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.widget.TabHost.setCurrentTab(TabHost.java:346)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.widget.TabHost.addTab(TabHost.java:236)
04-11 11:48:39.057: E/AndroidRuntime(3573): at com.myapp.activities.TabLayouts.addTab(TabLayouts.java:52)
04-11 11:48:39.057: E/AndroidRuntime(3573): at com.myapp.activities.TabLayouts.setTabs(TabLayouts.java:32)
04-11 11:48:39.057: E/AndroidRuntime(3573): at com.myapp.activities.TabLayouts.onCreate(TabLayouts.java:25)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.Activity.performCreate(Activity.java:4465)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1936)
04-11 11:48:39.057: E/AndroidRuntime(3573): ... 11 more
04-11 11:48:39.057: E/AndroidRuntime(3573): Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/myapp.activities.LatestAlbums}: android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@4198bfe8 is not valid; is your activity running?
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1972)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.ActivityThread.startActivityNow(ActivityThread.java:1813)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
04-11 11:48:39.057: E/AndroidRuntime(3573): at com.myapp.activities.TabGroupActivity.startChildActivity(TabGroupActivity.java:56)
04-11 11:48:39.057: E/AndroidRuntime(3573): at com.myapp.activities.LatestGroup.onCreate(LatestGroup.java:10)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.Activity.performCreate(Activity.java:4465)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
04-11 11:48:39.057: E/AndroidRuntime(3573): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1936)
04-11 11:48:39.057: E/AndroidRuntime(3573): ... 23 more
04-11 11:48:39.057: E/AndroidRuntime(3573): Caused by: android.view.WindowManager$BadTokenExcep
Sorry for the lots of code but really don't know what is causing this problem
Upvotes: 0
Views: 677
Reputation: 3382
As far as i see the problem is with the dialog you trying to show in the onCreate method.
You have to wait until the Activity's lifecycle methods are done. Use the post method as something like this pdialog.post(new Runnable() { pdialog.show(); });
to show the dialog only when the activity is up and running.
Edit: I can't delete the post because you accepted it already, however my approach is working only for views. So you have to create a handler and postDelay the dialog. I hope this will work.
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
pdialog = new ProgressDialog(LatestAlbums.this);
pdialog.setMessage(getString(R.string.loading_));
pdialog.setCancelable(true);
pdialog.setCanceledOnTouchOutside(false);
pdialog.show();
}
}, 1000);
Upvotes: 0
Reputation: 10969
Use:
Intent i = new Intent(getParent(),AlbumDetails.class);
Instead:
Intent i = new Intent();
And comment below line:
i.setClass(LatestAlbums.this, AlbumDetails.class);
Use:
TabGroupActivity parentActivity = (TabGroupActivity) getParent();
parentActivity.startChildActivity("AlbumDetailsLatest2", i);
Upvotes: 1