I have an Activity (Main
) which shows tabs like this:
private void initTabs(){
mTabHost = getTabHost(); // The activity TabHost
Intent intent;
intent = new Intent().setClass(this, MyGroup.class);
setupTab(intent, "tab");
}
private void setupTab(Intent intent, final String tag) {
View tabview = createTabView(mTabHost.getContext(), tag);
TabSpec setContent = mTabHost.newTabSpec(tag).setIndicator(tabview).setContent(intent);
mTabHost.addTab(setContent);
}
private static View createTabView(final Context context, final String text) {
View view = LayoutInflater.from(context).inflate(R.layout.tabs_bg, null);
((TextView) view.findViewById(R.id.tabsText)).setText(text);
return view;
}
The MyGroup
class is an ActivityGroup, which does the following:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = getLocalActivityManager().startActivity("activityA", new Intent(this, ActivityA.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
this.setContentView(view);
state = A;
}
public void openB() {
Intent i = new Intent(this, ActivityB.class);
View view = getLocalActivityManager().startActivity("activityB", i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
this.setContentView(view);
state = B;
}
So Main
has a tab with a MyGroup
. The MyGroup
starts with ActivityA
and then goes to ActivityB
. When I press the back button in ActivityB
, I want to go back to ActivityA
, and on back press in ActivityA
I want to close the app.
This is how I've done that. In ActivityB
:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
System.out.println("ActivityB PRESSED");
if (keyCode == KeyEvent.KEYCODE_BACK) {
MyGroup mg = (MyGroup) getParent();
return mg.onKeyDown(keyCode, event);
}
return super.onKeyDown(keyCode, event);
}
In ActivityA
the same:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
System.out.println("ActivityA PRESSED");
if (keyCode == KeyEvent.KEYCODE_BACK) {
MyGroup mg = (MyGroup) getParent();
return mg.onKeyDown(keyCode, event);
}
return super.onKeyDown(keyCode, event);
}
Now, in MyGroup
:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
System.out.println("MG PRESSED");
if (state == A)
return false;
else if (state == B) {
setContentView(getLocalActivityManager().startActivity("activityA", new Intent(this, ActivityA.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView());
state = A;
return true;
}
return false;
}
return super.onKeyDown(keyCode, event);
}
Finally, in Main
, just a system.out:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
System.out.println("MAIN PRESSED");
return super.onKeyDown(keyCode, event);
}
Now this is my current behavior, which I don't want:
- When app started, I'm in ActivityA. Backbutton -> app closes. OK.
- When app started, ActivityA -> ActivityB -> Back button -> ActivityA. OK.
- When app started, ActivityA -> ActivityB -> Back -> ActivityA -> ActivityB -> Back -> app closes. NOT OK!
Apparently, the second time ActivityB is shown, the back button is being handled by Main
, instead of ActivityB
or MyGroup
.
How can I fix this?
EDIT
I've added an ActivityC. It seems like behaviour in the first two activities is normal, and from the third on, the Main
activity handles the button press.
So A -> B -> A is handled by A -> B -> Main
and A -> B -> C is handled by A -> B -> Main.
Override public void onBackPressed()
in your activity and handle the back button click yourself.
Calling super.onBackPressed();
will affect the standard behaviour of back button press (also exit your app)
So I found the answer.
I have an admob adview in my Main
, which seems the cause of this problem. This is the xml:
<?xml version="1.0" encoding="utf-8"?>
<TabHost
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="0dp">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true" />
<com.google.ads.AdView
android:id="@+id/adView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
ads:adUnitId="@string/adkey"
ads:adSize="BANNER"
ads:loadAdOnCreate="false"
android:layout_alignParentBottom="true"
android:focusable="false"/>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@id/adView"
android:layout_below="@android:id/tabs" />
</RelativeLayout>
</TabHost>
When I remove the adview, the problem doesn't occur.
Now to solve this, I've changed the xml into this:
<?xml version="1.0" encoding="utf-8"?>
<TabHost
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="0dp">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true" />
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@android:id/tabs" />
</RelativeLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<com.google.ads.AdView
android:id="@+id/adView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
ads:adUnitId="@string/adkey"
ads:adSize="BANNER"
ads:loadAdOnCreate="false"
android:layout_alignParentBottom="true"
android:focusable="false" />
</RelativeLayout>
</FrameLayout>
</TabHost>
来源:https://stackoverflow.com/questions/7174624/back-button-behavior-with-tabs-and-activitygroup