2011-08-03 160 views
25

我添加使用獲取片段的容器視圖id

transaction.add(R.id.content, fragment, null); 

一個片段,我需要從這個開始新的片段。但要做到這一點,我需要知道第一個片段的容器視圖ID(R.id.content在我的情況)。我怎樣才能得到這個?

我可以直接使用這個ID,但我想片段應該不知道有關父活動的這種細節。例如,在這種情況下,將不可能在另一個活動中使用此片段。

可能是從另一個「開始」片段是一種不好的做法,所有的片段處理邏輯應該由活動本身來處理?但是,創建好的片段序列開始彼此似乎非常有用(例如detalView-> moreDetailView-> evenMoreDetailView)。

回答

65

你可以通過調用

((ViewGroup)getView().getParent()).getId(); 
+3

它給我null任何想法,當我嘗試說LinearLayout x =(LinearLayout)((ViewGroup)getView()時,我有主屏幕包含佈局,我用作父級的佈局。getParent());在片段類中被調用,但它總是爲空 – AMH

+0

工作就像一個魅力,謝謝你爲我節省了時間 –

11

不知道,如果我完全理解你的問題,但你在onCreateView中獲得容器。我想你可以把它藏在一個局部變量中。

public View onCreateView(LayoutInflater inflater, 
    ViewGroup container, 
    Bundle savedInstanceState) { 
    mContainer = container; 
    ... 
} 
+0

你明白正確。我可以這樣做,但對我來說它更像是一種黑客。容器在這裏被傳遞給片段以便能夠膨脹它的視圖,我懷疑它應該被存儲以供將來使用。以某種更原始的方式獲取容器視圖ID存在? –

+1

我看不出這種方法有什麼問題。如果您不想存儲視圖,只需存儲該ID。 –

5

假設你訪問容器的id有片段例如mCurrentFragment在Activity類。 您可以通過

int id = mCurrentFragment.getView().getParent().getId(); 
ViewGroup vg = (ViewGroup) findViewById(id); // Fragment's container View 
+1

(如果我正確理解你在做什麼)你從**獲得id的對象是**你正在尋找的對象對於。這兩行可以用下面的代碼替換:'ViewGroup vg =(ViewGroup)mCurrentFragment.getView()。getParent();'這不會等同於你所做的任何情況? – ToolmakerSteve

+0

是@ToolmakerSteve,它們總是等價的。感謝您爲我發現。 –

8

得到碎片的容器查看我覺得有訪問視圖,而不是使用

((ViewGroup) getView().getParent()).getId() 

我會假設你使用的是呈現一個MainActivity工作的更標準的方法列表片段,然後可以在單擊項目時顯示另一個列表片段,等等。我假設您已選擇將MainActivity的主視圖替換爲您呈現的列表片段的內容。

因爲每個列表片段都在MainActivity中承載,所以您始終可以訪問MainActivity的視圖。

// Inside of onListItemClick... 
FragmentManager fm = getFragmentManager(); 
Fragment fragment = new MyOtherListFragment(); 

FrameLayout contentView = (FrameLayout) getActivity().findViewById(R.id.content_view); 

fm.beginTransaction() 
     .replace(contentView.getId(), fragment) 
     .addToBackStack(null) 
     .commit(); 

上面的例子假設你有你在MainActivity設置XML佈局資源,調用XML資源R.layout.activity_main,那裏有一個id R.id.content_view一個FrameLayout裏。這是我採取的方法。我在這裏展示的例子是我實際在我的應用程序中編寫的一個簡單版本。

順便說一句,我的版本的IntelliJ的(1.0.1版本)警告我說,

((ViewGroup) getView().getParent) 

可能會拋出一個NullPointerException。

+1

好吧,在這個問題後的幾個星期裏,我已經瞭解到Fragments的設計缺陷超出了可用性,並且再也沒有使用過Fragments。 –