是否可以使用LayoutParams动态添加片段?我有2个片段要放在RelativeLayout中:一个应该锁定在左边。另一个应该锁定在右边。
答案 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>
但是,我认为不能以编程方式将布局参数应用于Fragment
s。毕竟,他们不是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;
}
}