2011-07-20 105 views
5

編輯:佈局片段的FrameLayout換成另一個片段的FrameLayout

所以下面的評論後,我再談並意識到發生了什麼掛我。

想象我的客戶名單和客戶詳細信息活動的啓動:

public class ClientsMainActivity extends FragmentActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //StudioTabOpenHelper db; 
     setContentView(R.layout.main_client_activity); 
    } 
} 

所以這偉大的工程,開始了我的main_client_Activity(以下佈局定義,我稱這種活動時,在我的主按鈕屏幕點擊):

Intent intent = new Intent(getActivity(), ClientsMainActivity.class); 
startActivity(intent); 

簡單的問題是,在ClientsMainActivity不叫OnCreateView或任何東西,只是設置佈局定義我的片段,我的ListFragment佈局。這是好的,因爲我不想要任何東西傳遞到ClientsMainActivity,但如果我有這樣一個假設的活動:

SessionMainsActivity當他們點擊一個客戶端的會話編輯被調用,那麼我就不會被調用SessionsMainActivity同樣的方式(開始活動,只是設置爲alayout),我會想要該佈局設置,因爲它定義了我的碎片如何分裂。但我也想傳遞數據到那個然後到後續的片段(比如他們點擊的是哪個會話進行編輯/使用

所以我想知道上面是否有道理,我相信它是一個簡單的我只是無法環繞我的大腦,我從其他片段調用FragmentActivitie s沒有問題,他們佔用了整個屏幕,但它的工作原理。所以我認爲最大的問題是ClientsMainActivity來自我在網上找到的一些例子,向您展示如何在屏幕上製作多個片段所做的一切就是將內容視圖設置爲可以完成所有工作的佈局,這就是爲什麼我無法弄清楚如何將它編碼爲做同樣的事情,但讓我傳遞值的碎片佈局定義等...

編輯完

所以我用這個可愛的小教程在這裏:

http://developer.android.com/guide/topics/fundamentals/fragments.html

它已經得到了我很長的路要走,並利用他們說的主要活動做什麼, fragment_layout.xml,我在左邊有一個很好的客戶列表(這是一個listfragment),右邊有一個細節片段。

然後,我添加了在客戶端編輯會話信息(或編輯客戶端詳細信息)的能力,兩者都是全屏幕片段。這很好。

現在我決定了我的會話編輯UI最好將信息再分成兩個窗格。

這是行不通的,因爲我覺得,就像我說我有一個main_Activity,這是否在OnCreate:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_client_activity); 
} 

main_client_activity.xml在兩個佈局被定義,但一個風景片是在這裏:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <fragment class="com.viciousbytes.studiotab.subactivities.ClientListView" 
     android:id="@+id/client_list" android:layout_weight="1" 
     android:layout_width="0px" android:layout_height="match_parent" /> 

    <FrameLayout android:id="@+id/client_details" android:layout_weight="1" 
     android:layout_width="0px" android:layout_height="match_parent" 
     android:background="?android:attr/detailsElementBackground"/> 

</LinearLayout> 

這一切都很好!在這種情況下,我處理一切在整個屏幕上的活動,開始了自己的片段:

EditSessionActivity EditClientActiivyt它們都使用getSupportFragmentManager()調用BeginTransaction,我可以將信息傳遞到它從.newInstance通話。

我有我的session_edit.xml佈局與按鈕,textviews等定義,並且工作很好。多數民衆贊成在我的SessionEdit片段「我的EditSessionActivity」「發射」加載但現在,因爲我想分開它,我遇到了一個障礙。上面我定義了一個client_list和一個client_details id,這些佔位符在我的屏幕上?當我想用完全不同的碎片替換那裏的時候,我會引用那些嗎?

還是我建立所謂像fragment_session_layout另一個片段佈局定義喜歡的東西:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <fragment class="com.viciousbytes.studiotab.subactivities.SessionEdit" 
     android:id="@+id/session_edit" android:layout_weight="1" 
     android:layout_width="0px" android:layout_height="match_parent" /> 

    <FrameLayout android:id="@+id/invoice_details" android:layout_weight="1" 
     android:layout_width="0px" android:layout_height="match_parent" 
     android:background="?android:attr/detailsElementBackground" /> 
</LinearLayout> 

對不起不知道該怎麼這個稱號對我的舌尖什麼,我問,基本上如何兩次得到兩片碎片。在線演示展示瞭如何做一個(以及一個簡單的ListFragment)。

我已經做了所有上述,我只是無法弄清楚如何傳遞到片段,我在我的EditSessionActivity利用這一點,我需要的數據:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    int clientID = getIntent().getIntExtra(THE_SELECTED_CLIENT, -1);    
    int sessionID = getIntent().getIntExtra(SELECTED_SESSION,-1); 
    SessionEdit edits = SessionEdit.newInstance(this.getBaseContext(), false, clientID, sessionID); 
    mUIListener = (OnUpdateUI)edits; 
    getSupportFragmentManager().beginTransaction().add(android.R.id.content, edits).commit(); 
} 

奏效,但要儘量堅持到前面的片段示例中,我假設我的EditSessionActivit y很像製作另一個MainActivity(因爲它有兩個面板,就像主面板一樣)。所以我在EditSessionActivity重新編碼的onCreate本:

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

這在我對付onCreateView EditSession片段戰鬥後,我得到了這最後的工作,但在數據不能通過引起不存在的實例對象使用像以前的onCreate其中有edits=SessionEdit.newInstance(...)

所以是做好其他片段佈局,其中有兩個痛苦,並啓動時,正確的行動是觸發的好做法。或者是應該替換兩個已經創建的片段?莫名其妙地從我的main_client_activity.xml

+0

我有同樣的「問題」現在,我已經得到了在視圖listfragments和我改變後dinamically一排selected.I想了很多哪一個是好,但我不認爲這是最好的方法我用過的。 – kameny

+0

這些在線片段的例子通常足以滿足簡單的情況,但除此之外,您還是自己做的。希望有人有一個好的建議。 – Codejoy

+0

我跟你aggree,這個教程適合基本情況,如果有人想創建複雜的UI與他需要想很多片段:d – kameny

回答

3

我假設編輯客戶端和編輯會話是兩個不同的活動。從「編輯客戶端」切換到「編輯會話」模式時,「列表」和「詳細信息」窗格都會更改?

我會去兩個佈局文件,而不是試圖重複使用相同的佈局和重新加載片段。

如果你試圖重複使用相同的佈局,你必須:

  • 變化@+id/invoice_details喜歡的東西@+id/right_pane。否則,會將與會話相關的內容加載到「invoice_details」佔位符中看起來很混亂。
  • 將片段定義替換爲另一個FrameLayout,並在運行時加載ClientListViewSessionListView(或稱爲片段)。

這會增加更多的複雜性比在我看來另一個佈局xml文件。

所以

  • 把你現有的代碼與客戶名單和客戶的詳細信息工作
  • 複製所有相關零件,並改變需要改變什麼,所以它現在會話列表和會話細節
  • 刪除它很容易做到的複製(常用功能轉到實用程序類,常見佈局元素包括佈局)。留下難以按原樣去重的東西。
  • 以後重新評估,當你有更多的片段,更多的佈局和更多的經驗。

UPDATE,關於兩種不同的方法片段可以嵌入在活動

由於Android文檔狀態,還有你可以得到一個片段,在你的活動顯示主要有兩種方式:

  • 聲明片段佈局的XML文件(<fragment class=.... />
  • 放一個佔位符FrameLayout佈局的XML文件,並加載片段在運行時

當片段不需要接收任何參數時,第一種方法很好。例如,如果檢索單個和唯一客戶列表的邏輯是在片段代碼中進行硬編碼的。

第二種方法可以將參數傳遞給片段,因此適用於「細節向下」類型的片段。

從更新的問題,我的理解是,

  • 每個客戶在遊樂活動
  • 成分的單獨列表如下:EditSessionActivity承載兩個片段,一個用於顯示會話列表,另一個用於顯示會話詳細信息

如果這是正確的,那麼確實需要以編程方式加載這兩個片段,因爲兩者都需要傳遞給參數。所以你的佈局將有兩個FrameLayoutEditSessionActivity首先從意圖獲取一些參數(「我們正在使用哪個會話列表?」),然後用這些參數加載「會話列表」片段。當用戶選擇該片段中的列表項時,其他片段將加載會話詳細信息。

+0

感謝您的答覆。我會去解決這個問題。我認爲最大的問題是我的佈局代碼的工作方式是一方是ListFragment,另一方只是一個FrameLayout。所以在我的會話中,我想要兩個FrameLayouts(或者在這一點上它們會是碎片?)我想我也很困惑如何在這種情況下將一些複雜的對象(我自己的數據對象)傳遞給FragmentActivity,也許只是使其可串行化?我沒有時間看這個,所以我會仔細檢查一下,看看哪個部分特意掛我,並在這裏重新發布。 – Codejoy

+0

如果會話內容類似於客戶端(左側會話列表,右側會話詳細信息),那麼我認爲您的佈局也會類似:左側爲ListFragment,右側爲FrameLayout。當在左側列表上選擇項目時,用於編輯會話細節的片段將被加載到FrameLayout中。至於傳遞數據:無論是可序列化(parcelable)對象還是全局狀態。或者,如果對象來自本地sqlite數據庫之類的東西,則可以傳遞數據庫ID,並在需要時從DB讀取對象。 –

+0

好了更新的問題,以反映我的主要問題。 – Codejoy

相關問題