2012-09-10 48 views
4

是否可以動態添加片段與LayoutParams?我有兩個片段,我想放在一個RelativeLayout中:一個應該鎖定在左邊。另一個應該鎖定在右邊。動態添加片段與LayoutParams

+2

你絕對需要一個'RelativeLayout'?這聽起來像是一個水平LinearLayout的工作...... – hwrdprkns

+0

這是爲了簡單起見的一個例子。 – user123321

回答

2

可能將它們分別包裹在佈局中(例如LinearLayout),然後設置其大小和位置。 This answer是關於類似的問題,並顯示如何使用具有自定義佈局參數的FrameLayout來包含Fragment

請注意,在XML中使用fragment對象時,可以使用android:layout_*屬性來控制其位置。像這樣:

<LinearLayout 
    android:orientation="horizontal" 
    ... > 

    <fragment 
     android:layout_height="wrap_content" 
     android:layout_width="0px" 
     android:layout_weight="1" 
     ... /> 

    <fragment 
     android:layout_height="wrap_content" 
     android:layout_width="0px" 
     android:layout_weight="1" 
     ... /> 

</LinearLayout> 

不過,我不認爲這是可能的編程方式應用佈局參數Fragments。畢竟他們不是ViewGroup

+1

這就是我害怕的。我希望這不是事實。多麼糟糕的API選擇。谷歌咆哮着沒有嵌套不需要的佈局,現在我不得不使用嵌套佈局定位碎片。嘆息...... – user123321

+0

好吧,考慮一個'片段'和'活動'一樣。他們執行稍微不同的任務,但都不是佈局對象。它們都是爲單獨運行一部分流程而設計的。對我來說,這實際上是一個很好的設計決定;它使功能代碼與佈局代碼分開。 – Eric

+0

我想我會嘗試在我的片段上使用setLayoutParams,然後在onCreateView中將自定義佈局參數添加到視圖中,然後再返回它。仍然可怕我需要一個「ID」的容器,不能使用參考....你殺了我厄爾古戈。 – user123321

5

我用下面的方法了ListFragment在LinearLayout中:

class CustomListFragment 
    extends ListFragment 
{ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 
    { 
     ViewGroup v = (ViewGroup) super.onCreateView(inflater, container, 
       savedInstanceState); 
     v.setLayoutParams(new LinearLayout.LayoutParams(0, 
       LinearLayout.LayoutParams.MATCH_PARENT, 1)); 
     return v; 
    } 
} 

現在,我對對方的回答閱讀您的意見,我認爲這是類似於你算什麼。

但是請注意:框架可能會實例化您的片段。因此,這個類必須是公共的,並且必須有一個沒有任何進一步參數的構造函數。

因此,任何用於定製碎片的setter方法都不起作用,因爲它們不會被任何框架創建的實例調用。

+0

這個作品!這些LayoutParams應用於包含框架視圖的視圖。 – babay

0

可以在onCreateView方法設置LayoutParameters您的片段的。 Befor將最終視圖返回爲此方法的返回值,您可以設置佈局參數。正如下面片段的樣品返回一個TextView作爲其搜索其中stucked到其父通過在其上設置的LayoutParams左:

public static class DummySectionFragment extends Fragment { 
    public static final String ARG_SECTION_NUMBER = "placeholder_text"; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     TextView textView = new TextView(getActivity()); 
     textView.setGravity(Gravity.CENTER); 
     textView.setText(Integer.toString(getArguments().getInt(
       ARG_SECTION_NUMBER))); 
     LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); 
     lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
     textView.setLayoutParams(lp); 

     return textView; 
    } 
} 
1

對於特殊情況下,可以移動至層排序成在onStart()覆蓋

片段看起來是這樣的

公共類FragmentOne擴展片段{

private Client client; 

public interface Client { 
    RelativeLayout.LayoutParams fetchFragmentOneParams(FragmentOne fragment); 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    Activity activity = getActivity(); 

    try { 
     client = (Client) getActivity(); 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " must implement FragmentOne.Client"); 
    } 
} 

@Override 
public void onStart() { 
    super.onStart(); 

    getView().setLayoutParams(client.fetchFragmentOneParams(this)); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    RelativeLayout view = new RelativeLayout(getActivity()); 
    // 
    // code 
    // 
    return view; 
}