2013-04-24 72 views
0

我有3個選項卡的Android標籤與ListActivity返回按鈕

TAB1,TAB2,TAB3

public Class TabLayout extends TabActivity { 
    Tab1,Tab2,Tab3 
} 

每個標籤包含一個ListActivity

這意味着

TAB1 >>> Tab1ListActivity(列表帶圖像和文字)

Tab2 >>> Tab2ListActivity(List with Image and文本)

TAB3 >>> Tab3ListActivity(列表與圖像和文本)

,如果我點擊任何列表項從(Tab1ListActivity,Tab2ListActivity等等......)

我轉發到一個更多活動(Tab1ListItemActivity,Tab2ListItemActivity等......)

但我的實際要求是,如果假設我從Tab2ListItemActivity單擊後退按鈕,然後我

應該可以轉發到Tab2ListActivity

但是,如果我寫我的代碼是這樣

public class Tab2ListItemActivity extends Activity 
{ 

    //on Back Button Pressed 

    Intent intent=new Intent(Tab2ListItemActivity.this,TabLayout.class); 

    startActivity(intent); 

    Tab2ListItemActivity.this.finish(); 
} 

當我執行上面的代碼中,我能夠轉發到我的TabLayout(Tab1ListActivity),但不Tab2ListActivity?,怎麼一回事,因爲

Tab2ListItemActivity與Tab2ListActivity有關

任何人都可以幫忙嗎?

+1

爲什麼不保留默認行爲(不要重寫onBackPressed)?它將恢復到之前的活動。 – 2013-04-24 18:40:58

+0

爲什麼你想重寫OnBackPressed當默認行爲是服務於你的目的 – prvn 2013-05-21 08:44:53

回答

1
  1. 爲什麼你想覆蓋後退按鈕?我的意思是,只要讓默認行爲發生,然後按下後退按鈕就可以進入上一個活動。

  2. 如果你真的想這樣做,你的方式,那麼你就需要啓動TabLayout活動之前和內部TabLayout的onCreate()你需要檢查tab id並啓動設置tab id對應的ListActivity。 tab id is 1 by default這就是爲什麼它總是帶你到Tab1ListActivity

+0

你能給我的示例代碼 – String 2013-04-24 19:00:28

1

爲什麼不保留默認行爲(不要重寫onBackPressed)?它將恢復到之前的活動。

解決方案1 ​​

不要完成TabLayout活動。並在Tab2ListItemActivity活動中保留後退按鈕的默認實現。

解決方案2(硬,力道):

添加它應該開什麼標籤的意圖額外費用。

Intent intent = new Intent(Tab2ListItemActivity.this, TabLayout.class); 
intent.putExtra(TabLayout.EXTRA_TAB_TO_OPEN, 1); 
startActivity(intent); 
Tab2ListItemActivity.this.finish(); 

在TabLayout活動

@Override 
protected void onPostCreate(Bundle state) { 
    super.onPostCreate(state); 
    handleTab(getIntent()); 
} 

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    handleTab(intent); 
} 


private void handleTab(Intent intent) { 
    // init tabs 
    final int tab = intent.getIntExtra(EXTRA_TAB_TO_OPEN, -1); 
    if (tab != -1) { 
     getTabHost().setCurrentTab(tab); 
    } 
} 
+0

我沒有得到你的代碼,你能解釋一下嗎? – String 2013-04-24 19:27:33

+1

解決方案1:後退按鈕應該會自動關閉Tab2ListItemActivity,並且您可以返回到前一個打開了最後一次打開的選項卡的活動。我懷疑確實需要執行代碼。或者如果確實如此,則代碼:當您啓動TabLayout活動時,您將傳遞指示打開Intent的標籤的int值。 TabLayout然後檢索您從Tab2ListItemActivity傳遞的選項卡索引並將其打開。 – 2013-04-25 06:03:25

0

我收到同樣的問題,但我解決了使用此解決方案。

TabSample.class

public class TabSample extends TabActivity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     TabHost tabHost = getTabHost();  

     tabHost.addTab(tabHost.newTabSpec("tab1") 
       .setIndicator("OPT") 
       .setContent(new Intent(this, TabGroup1Activity.class))); 

     tabHost.addTab(tabHost.newTabSpec("tab2") 
       .setIndicator("EDIT") 
       .setContent(new Intent(this, TabGroup2Activity.class))); 

     tabHost.setCurrentTab(1); 
    } 
} 

TabGroup1Activity.class

public class TabGroup1Activity extends TabGroupActivity{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     startChildActivity("OptionsActivity", new Intent(this,OptionsActivity.class)); 
    } 
} 

OptionsActivity.class

public class OptionsActivity extends Activity { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.optionspage); 

     Button back = (Button) findViewById(R.id.BackButton1); 
     Button next = (Button) findViewById(R.id.NextButton1); 

     OnTouchListener backListener = new OnTouchListener() { 
       public boolean onTouch (View v, MotionEvent event) { 
        if (event.getAction()==MotionEvent.ACTION_UP){ 
         finish(); 
        } 
        return false; 
       } 
      }; 

     OnTouchListener nextListener = new OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction()==MotionEvent.ACTION_UP){ 
        Intent edit = new Intent(getParent(), EditActivity.class); 
        TabGroupActivity parentActivity = (TabGroupActivity)getParent(); 
        parentActivity.startChildActivity("EditActivity", edit); 
        return true; 
       } 
       return false; 
      } 
     }; 

     back.setOnTouchListener(backListener); 
     next.setOnTouchListener(nextListener); 
    } 
} 

˚F最後通過TabGroupActivity.class保存所有的stat實例。

public class TabGroupActivity extends ActivityGroup { 
    private ArrayList<String> mIdList; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  
     if (mIdList == null) mIdList = new ArrayList<String>(); 
    } 

    @Override 
    public void finishFromChild(Activity child) { 
     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); 
     setContentView(newWindow.getDecorView()); 
    } 

    public void startChildActivity(String Id, Intent intent) {  
     Window window = getLocalActivityManager().startActivity(Id,intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); 
     if (window != null) { 
      mIdList.add(Id); 
      setContentView(window.getDecorView()); 
     }  
    } 

    @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); 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      onBackPressed(); 
      return true; 
     } 
     return super.onKeyUp(keyCode, event); 
    } 

    public void onBackPressed() { 
     int length = mIdList.size(); 
     if (length > 1) { 
      Activity current = getLocalActivityManager().getActivity(mIdList.get(length-1)); 
      current.finish(); 
     } 
    } 
} 

這是真棒解決方案,您可以嘗試this.and作出適當manifest項。