2011-08-24 45 views
0

我有這說明標籤這樣一個活動(Main):與標籤後退按鈕的行爲和的ActivityGroup

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有一個標籤,其中MyGroupMyGroupActivityA開頭,然後去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。後退 - >應用程序關閉。好。
  • 當應用程序啓動時,ActivityA - > ActivityB - >後退按鈕 - > ActivityA。好。
  • 當應用程序啓動時,ActivityA→ActivityB→Back→ActivityA→ ActivityB→Back→應用程序關閉。不好!

顯然,第二時間ActivityB所示,後退按鈕正在被處理Main代替ActivityBMyGroup

我該如何解決這個問題?

編輯

我已經添加了一個ActivityC。看起來前兩個活動的行爲是正常的,從第三個活動開始,Main活動處理按鈕按下。

所以A - >乙 - > A是被處理 - >乙 - >主

和A - >乙 - >乙 - - >主> C由一個處理。

回答

0

所以我找到了答案。

我有一個admob adview在我的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> 

當我刪除adview時,問題不會發生。

我們解決這個問題,我已經改變了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> 
0

在您的活動中重寫public void onBackPressed()並處理後退按鈕,單擊自己。 通話super.onBackPressed();將影響後退按鈕按下的標準行爲(也退出您的應用程序)

+0

使用'onKeyDown'或'onBackPressed'產生同樣的效果。 – nhaarman