我有一个活动(Main
),它显示这样的标签:
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;
}
MyGroup
类是一个ActivityGroup,它执行以下操作:
@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;
}
所以Main
和MyGroup
有一个标签。MyGroup
从ActivityA
开始,然后到ActivityB
。当我在ActivityB
中按后退键时,我想回到ActivityA
,并在ActivityA
中按后退键,我想关闭应用程序。
我是这样做的。在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);
}
在ActivityA
相同:
@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);
}
现在,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);
}
最后,在Main
中,只有system.out:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
System.out.println("MAIN PRESSED");
return super.onKeyDown(keyCode, event);
}
现在这是我当前的行为,我不想要的:
- 当应用程序启动时,我在ActivityA。Backbutton -> app关闭。好的。
- 应用启动时,ActivityA -> activitb ->后退按钮-> ActivityA。好的。
- 当app启动时,ActivityA -> activitb -> Back -> ActivityA ->ActivityB ->返回->应用程序关闭。不可以!
显然,第二次显示ActivityB时,后退按钮由Main
处理,而不是ActivityB
或MyGroup
。
我该如何解决这个问题?
编辑
我已经添加了一个活动c。似乎前两个活动的行为是正常的,从第三个开始,Main
活动处理按钮按下。
所以A -> B -> A由A -> B -> Main处理
和A -> B -> C由A -> B -> Main处理。
覆盖public void onBackPressed()
在您的活动和处理后退按钮点击自己。调用super.onBackPressed();
将影响返回键按下的标准行为(也退出你的应用程序)
我找到了答案。
我有一个admob的建议在我的Main
,这似乎是这个问题的原因。这是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>
当我删除通知时,问题就不会发生了。
现在为了解决这个问题,我将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">
<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>