4

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

4

4 回答 4

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

于 2012-10-20T13:09:29.337 回答
2

可以将它们分别包装在一个布局中(例如 a LinearLayout),然后设置其大小和位置。这个答案是关于一个类似的问题,并展示了如何使用FrameLayout带有自定义布局参数的 a 来包含 a Fragment

请注意,fragment在 XML 中使用对象时,可以使用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>

但是,我认为不可能以编程方式将布局参数应用于FragmentsViewGroup毕竟他们不是s。

于 2012-09-10T19:09:49.387 回答
1

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

片段看起来像这样

公共类 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;
}
于 2017-01-13T20:11:42.953 回答
0

您可以在onCreateView方法中设置Fragment 的LayoutParameters 。在返回最终视图作为此方法的返回值之前,您可以设置布局参数。作为片段下面的示例,通过在其上设置 LayoutParams 返回一个 TextView 作为其视图,该视图粘在其父级左侧:

    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;
    }
}
于 2013-09-24T08:12:15.173 回答