TabGroup Activity problem in android
i have TabAvtivity, in which under particular Tab i have a single Tab GroupActivity ,under this group i have 3 activities. here is the below format.
TabActivity-->Tab1 Tab2 Tab3
under Tab2 --> TabGroupActivity.
under TabGroupActivity--> Activiy1 --> Activity 2 --> Activity 3.
the problem is under TabGroupActivity if i select Activity 2 from Activity 1 . and when i press back from Activity 2. the Activity 1 is restarting. i dont want this to be happened. same with Activity 2 and three
here is my TabGroupActivity
public class TabGroupActivity extends ActivityGroup {
private ArrayList<String> mIdList;
static boolean restartFlag=false;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if (mIdList == null) mIdList = new ArrayList<String>();
}
/**
* This is called when a child activity of this one calls its finish method.
* This implementation calls {@link LocalActivityManager#destroyActivity} on the child activity
* and starts the previous activity.
* If the last child activity just called finish(),this activity (the parent),
* calls finish to finish the entire group.
*/
@Override
public void finishFromChild(Activity child)
{
restartFlag=true;
Log.e("finishFromChild","finishFromChild");
LocalActivityManager manager = getLocalActivityManager();
int index = mIdList.size()-1;
if (index < 1) {
finish();
return;
}
//manager.destroyActivity(mIdList.get(index), true);
mIdList.remove(index);
index--;
String lastId = mIdList.get(index);
Intent lastIntent = manager.getActivity(lastId).getIntent();
Window newWindow = manager.startActivity(lastId, lastIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
setContentView(newWindow.getDecorView());
}
/**
* Starts an Activity as a child Activity to this.
* @param Id Unique identifier of the activity to be started.
* @param intent The Intent describing the activity to be started.
* @throws android.content.ActivityNotFoundException.
*///Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP
public void startChildA开发者_如何学Pythonctivity(String Id, Intent intent) {
Window window;
Log.e("startChildActivity","startChildActivity");
window = getLocalActivityManager().startActivity(Id,intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP ));
if (window != null)
{
mIdList.add(Id);
setContentView(window.getDecorView());
}
}
/**
* The primary purpose is to prevent systems before android.os.Build.VERSION_CODES.ECLAIR
* from calling their default KeyEvent.KEYCODE_BACK during onKeyDown.
*/
/*@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK)
{
//preventing default implementation previous to android.os.Build.VERSION_CODES.ECLAIR
return true;
}
return super.onKeyDown(keyCode, event);
}
*//**
* Overrides the default implementation for KeyEvent.KEYCODE_BACK
* so that all systems call onBackPressed().
*//*
@Override
public boolean onKeyUp(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK) {
onBackPressed();
return true;
}
return super.onKeyUp(keyCode, event);
}*/
/**
* If a Child Activity handles KeyEvent.KEYCODE_BACK.
* Simply override and add this method.
*/
@Override
public void onBackPressed ()
{
Log.e("onBackPressed","Back Came Here");
int length = mIdList.size();
Log.d("onBackPressed",String.valueOf(length));
if ( length >= 1)
{
Activity current = getLocalActivityManager().getActivity(mIdList.get(length-1));
current.finish();
}
}
}
You have made this complex. I would prefer something like this for sake of simplicity.
TabActivity -> Tab1 Activity, Tab2 Activity and Tab3 Activity
For the Tab2 Activity you can use ViewAnimator if the requirement is to show different screens.
For the above question, you need to look into where your onBackPressed event is getting propogated and handled. The way you have done it could be any of the activity or TabGroupActivity or parent TabActivity.
@ E-Madd
here i will post the answer. the actual problem was with destroy() method of ActivityGroup (which is a bug), so use this custom destroy method to solve the problem.
public boolean destroy(String id , LocalActivityManager manager) {
if(manager != null){
manager.destroyActivity(id, false);
try {
final Field mActivitiesField = LocalActivityManager.class.getDeclaredField("mActivities");
if(mActivitiesField != null){
mActivitiesField.setAccessible(true);
@SuppressWarnings("unchecked")
final Map<String, Object> mActivities = (Map<String, Object>)mActivitiesField.get(manager);
if(mActivities != null){
mActivities.remove(id);
}
final Field mActivityArrayField = LocalActivityManager.class.getDeclaredField("mActivityArray");
if(mActivityArrayField != null){
mActivityArrayField.setAccessible(true);
@SuppressWarnings("unchecked")
final ArrayList<Object> mActivityArray = (ArrayList<Object>)mActivityArrayField.get(manager);
if(mActivityArray != null){
for(Object record : mActivityArray){
final Field idField = record.getClass().getDeclaredField("id");
if(idField != null){
idField.setAccessible(true);
final String _id = (String)idField.get(record);
if(id.equals(_id)){
mActivityArray.remove(record);
break;
}
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
return false;
}
and also paste this below line
Window newWindow = manager.startActivity(lastId, lastIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
and dont add any flags while starting the activity. and also you can refer this link for more info destroyActivity() Bug in LocalActivityManager class in Android issue
This is working fine for me.
精彩评论