是否可以使用 LayoutParams 动态添加片段?我有 2 个片段要放入 RelativeLayout:一个应该锁定在左侧。另一个应锁定在右侧。
4 回答
我对 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 方法都不起作用,因为它们不会被任何框架创建的实例调用。
您可以将它们分别包装在一个布局中(例如 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>
但是,我认为不可能以编程方式将布局参数应用于Fragment
s。ViewGroup
毕竟他们不是s。
对于特定情况,您可以将层排序移动到 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;
}
您可以在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;
}
}