使用LayoutParams动态添加片段

时间:2012-09-10 19:03:44

标签: android android-fragments

是否可以使用LayoutParams动态添加片段?我有2个片段要放在RelativeLayout中:一个应该锁定在左边。另一个应该锁定在右边。

4 个答案:

答案 0 :(得分:6)

我在LinearLayout中对ListFragment使用了以下方法:

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方法都不起作用,因为不会为任何框架创建的实例调用它们。

答案 1 :(得分: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

答案 2 :(得分:1)

对于特定情况,您可以将图层排序移动到onStart()override

片段看起来像这样

公共类FragmentOne扩展了Fragment {

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;
}

答案 3 :(得分:0)

您可以在 onCreateView 方法中设置片段的 LayoutParameters 。 返回最终视图作为此方法的返回值,您可以设置布局参数。作为下面的一个示例片段返回一个TextView作为其View,它通过在其上设置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;
    }
}