6

我的目標是API應用程序到API 15和最低8.所以我使用支持庫來管理片段。我在應用程序的幾個部分中使用了一組片段。添加一個片段作爲ListView標題

現在,在一個活動我都在佈局一個ListView:

<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/listOfEvents" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 
</ListView> 

我想補充我的一個片段在ListView頭。我嘗試這樣做:

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

    listOfEvents = (ListView) findViewById(R.id.listOfEvents); 

      Fragment fragment = new SortingStandardFragment(); 
      getSupportFragmentManager() 
       .beginTransaction() 
        .add(fragment, null) 
       .commit(); 

      View fragmentView = fragment.getView(); // problem: fragment is null! 
      listOfEvents.addHeaderView(fragmentView); 
    } 

,但我得到一個錯誤,因爲fragment.getView()返回null(API參考文檔說,我要放GroupView標識中添加通話,但我應該在哪裏把GroupView在?佈局 是否有另一種方式來切中要害

+0

我不確定這可以這樣工作,但片段的想法是創建一個framelayout設置一個id(你可以通過在資源中添加id名稱來創建id),添加爲標題,然後用一個事務替換該id片段 – sherpya

回答

14

我通過創建一個包含只是我需要在列表標題中的片段的新的佈局解決了這個:

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

    <fragment 
     android:id="@+id/myFragmentEmbedded" 
     android:name=".SortingStandardFragment" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

,並在活動代碼:

LayoutInflater inflater = getLayoutInflater(); 
header = inflater.inflate(R.layout.myLayout, null); 
listOfEvents.addHeaderView(header); 

SortingStandardFragmenttitleFragment = (SortingStandardFragment) 
    getSupportFragmentManager() 
      .findFragmentById(R.id.myFragmentEmbedded); 
4

我想要一個版本,而不必訴諸另一個XML文件,所以這裏有雲:

Fragment fragment = ... 
FrameLayout v = new FrameLayout(getActivity()); 
v.setId(42); 
listView.addHeaderView(v, null, false); 
FragmentManager fm = getActivity().getSupportFragmentManager(); 
fm.beginTransaction().add(v.getId(), fragment).commit(); 
+8

儘管如此,最好在ids.xml文件中聲明id,以確保不存在重疊ID的風險。 – njzk2

+0

如果您添加頭容器ListView不在onCreate(supposably在請求後),你的應用程序在onBackPressed()崩潰,因爲列表視圖摧毀子(你的頭容器)停止後 - fragmentmanager不注入你的片段到容器 – merovingen

1

如果有些人好奇,爲什麼他的第一次嘗試失敗:

  • 生命週期事件發佈到UI線程
  • Fragment.onCreateView是生命週期事件
  • Activity.onCreate是生命週期事件
  • .getView()返回Fragment.onCreateView
  • commit發佈生命週期事件的創建的視圖

結論:commit結果是從下一個循環是onCreate返回後可見。

在閱讀完文檔後,可以試着迫使commit立即與getSupportFragmentManager().executePendingTransactions()聯繫。