2011-11-09 43 views
3

你好,我很難改變片段活動的可視化視圖。我創建了所有選項卡,但onClick我不知道如何將活動傳遞到該空白區域。Android如何與Fragment標籤進行交互

http://i40.tinypic.com/22bwxx.png

所以這個結構是一個簡單的活動名爲Main剛剛設置的內容視圖的maintabholder.xml文件保存它連接到一個名爲MainNav其內容的視圖類的片段視圖包含所有標籤在底端。

maintabholder.xml

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
> 

<include layout="@layout/header" android:layout_alignParentTop="true"   android:id="@+id/headerArea"></include> 
<fragment 
    class="my.package.name.MainNav" 
    android:id="@+id/fragment_tabs" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 
</LinearLayout> 

MainNav.java code snippet

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
{ 
    mRoot = inflater.inflate(R.layout.fragment_tabs, null); 
    mTabHost = (TabHost) mRoot.findViewById(android.R.id.tabhost); 
    setupTabs(); 
    return mRoot; 
} 

和R.layout.fragment_tabs:

<?xml version="1.0" encoding="utf-8"?> 
<TabHost 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@android:id/tabhost" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="#EFEFEF"> 

<RelativeLayout 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <TabWidget 
     android:id="@android:id/tabs" 
     android:layout_alignParentBottom="true" 
     android:layout_width="fill_parent" 
     android:background="@drawable/tab_background" 
     android:gravity="center_horizontal" 
     android:layout_height="wrap_content" > 
    </TabWidget> 

     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="fill_parent" 

      android:layout_height="wrap_content"> 

      <FrameLayout 
       android:id="@+id/tab_1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 

      <FrameLayout 
       android:id="@+id/tab_2" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 
      <FrameLayout 
       android:id="@+id/tab_3" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 
       <FrameLayout 
       android:id="@+id/tab_4" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 
       <FrameLayout 
       android:id="@+id/tab_5" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 

     </FrameLayout> 
</RelativeLayout> 

和最後續活動的經濟需求,我想加載到片段(在按下按鈕TAB1)

public class HomeFragment extends Activity { 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.home); 

    } 
} 

那就是幫助你得到的東西的要點,但在這裏發生在MainNav.java問題:

@Override 
    public void onTabChanged(String tabId) { 
     Log.d(TAG, "onTabChanged(): tabId=" + tabId); 
     if (TAB_HOME.equals(tabId)) { 
      updateTab(tabId, R.id.tab_1); 
      mCurrentTab = 0; 
      return; 
     } 
    } 

點擊選項卡時,被登記在onTabChanged活性,updateTab函數被調用:

private void updateTab(String tabId, int placeholder) { 
     FragmentManager fm = getFragmentManager(); 
     if (fm.findFragmentByTag(tabId) == null) { 
      //fm.beginTransaction() 
      //  .replace(placeholder, /*need fragment object here*/ , tabId) 
      //  .commit(); 
      // 
     } 
} 

註釋掉replace方法正在尋找一個(int, fragment, string),我想它應該改變我的空白空間。

但我不明白我從哪裏得到片段對象!這個幻象對象需要以某種方式包含我的HomeFragment的xml佈局,並允許我與我爲HomeFragment活動編碼的其他所有內容進行交互。

我的第一個預感是我的HomeFragment活動需要extend FragmentActivity而不是 只是活動。但這是我撞牆的地方。

有關兼容包方法的文檔很少,但TabActivity的文檔說不再使用TabActivity,所以我在這裏。針對Android 2.2+開發

Insight深表讚賞。

回答

5

你不能把活動分成片段,這很簡單。您必須將提供標籤內容的活動轉換爲碎片。這不應該是一個問題,因爲你不在這些活動中使用片段。

因此,這裏有2個規律可循:

  1. 你不能把活動成了碎片。
  2. 您不能將碎片放入碎片中。

我建議您在佈局上保留底部片段,以處理Tab-Widget中的Tab切換。如果發生選項卡切換,則將其報告給父活動,這會將相應的片段加載到tab片段之上。爲了達到這個目的,你必須修改你的佈局,這樣它的ViewGroup在標籤片段之上和標題之下。您將動態加載帶有標籤內容的片段到該ViewGroup中。

這裏的佈局(maintabholder.xml):

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
> 

<include layout="@layout/header" android:layout_alignParentTop="true"   android:id="@+id/headerArea"></include> 

<FrameLayout android:id="@+id/TabContent" 
    android:layout_width="fill_parent" 
    android:layout_height="0dip" 
    android:layout_weight="1"/> 

<fragment 
    class="my.package.name.MainNav" 
    android:id="@+id/fragment_tabs" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 
</LinearLayout> 

當製表開關在底部片段發生了,你告訴這個父活動:

... 
(YourActivity)getActivity().switchToTab(tabId); 
... 

而在YourActivity :

... 
public void switchToTab(int tabId){ 
    switch(tabId){ 
    ... 
    case 2: 
     getSupportFragmentManager().beginTransaction().replace(R.id.TabContent, TabContentFragment2.newInstance(), "someTag").commit(). 
    break; 
    ... 
    } 
} 

就是這樣的。

+0

這非常有幫助!我有一件事是我的一個活動包含谷歌地圖。所以它必須擴展MapActivity。如果我將該活動更改爲FragmentActivity,那麼它會崩潰並顯示明顯的錯誤「mapview只能從MapActivity調用」,這對我和這個片段結構來說都是一個問題,除非我創建了某種混合的MapFragmentActivity ..... – CQM

+0

考慮使用這個lib https://github.com/petedoyle/android-support-v4-googlemaps。雖然我沒有任何經驗,但它可能工作。 –

+3

@ZsomborErdődy-Nagy - 你推薦支持庫,但是之後還聲明片段不能位於片段內,這不再是真的。支持庫用於解決某些問題,但自從發佈了v11之後,有一些嵌套的片段提供了一些特定的邏輯來支持它(getChildFragmentManager)。因此,對於發現此線程的其他人,活動可能不在片段中,但片段現在可能處於片段中。 – SandWyrm

相關問題