在滚动布局中设置动态创建的片段的百分比大小

时间:2016-11-24 20:42:29

标签: android android-layout android-fragments

我是Android开发的新手,所以我希望这是一个简单的问题。我试图实现以下目标:

  • 我的活动包含一个垂直方向的LinearLayout
  • 在onCreate期间,我从用户可以访问的服务加载资源列表,每个用户可以有所不同
  • 对于每个资源,我创建了某种类型的片段并通过片段事务将其添加到线性布局
  • 每个片段应占活动高度的1/3
  • 如果添加了3个以上的片段,这些片段将在屏幕外,并可以滚动到

我不清楚如何将动态创建的片段设置为相对于屏幕具有高度,但仍然允许比屏幕更适合的片段。我已经考虑过设置重量和重量,但是不确定这是否有用,因为我希望对所有碎片赋予相同的权重。

我看过代码示例涉及将片段的布局参数设置为片段的onCreateView()中的LinearLayout.LayoutParams实例。如果解决方案涉及到这个问题,那么如何处理片段在不同类型的布局中使用的可能性?片段需要知道它包含的内容对我来说似乎是对的。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

回答你的观点:

  • 您使用dimens.xml文件中设置的维度,并根据设备的dpi设置(xhdip,xxhdip,xx等)覆盖该维度。您还可以通过指定特定的屏幕宽度来覆盖。考虑到您的边距和填充,您将可用空间除以3,这是您的宽度。

  • 您想要做的事情听起来更像是使用水平滚动ListView而不是ScrollView,但两者都可以实现。如果使用ScrollView,您只需将每个View类型手动添加到rootView。

  • 您不需要为不同的布局创建不同的片段。您可以创建一个片段类,在构造函数中将布局文件传递给它。您还应该使用ViewHolder模式来简化片段/布局关系。这样,通过少量逻辑,您可以拥有1个处理数十种不同布局的片段。

视图持有者只是一个具有公共方法/属性的POJO类;一个例子:

public class MyViewHolder {
    public TextView myTextView;

    public MyViewHolder(View rootView) {
        myTextView = (TextView) rootView.findViewById(R.id.whatever);
    }
}

然后使用以下方法绑定它:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.layout_file, container, false);
    view.setTag(myViewHolder);
    return view;
}

然后像这样设置视图:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    myViewHolder.myTextView.setText("Hello World!");
    ...
}

但问题在于 - 您的视图持有者与片段紧密耦合,因为您已经暴露了公共属性,因此您需要在片段和片段之间创建1:1的关系。观点持有人。

相反,您应该将关系解耦并在视图持有者中包含逻辑,并将其用作片段的扩展。

public interface SomeGenericViewHolder {
    void doSomething();
}

接口是可选的,但在这种情况下应该使用,因为它强制执行访问包含数据的合同。

public class MyViewHolder implements SomeGenericViewHolder {
    protected TextView myTextView;

    public MyViewHolder(View rootView) {
        myTextView = (TextView) rootView.findViewById(R.id.whatever);
    }

    @Override
    public void doSomething() {
        myTextView.setText("Hello World!");
    }

然后构建你的片段:

MyFragment fragment = new MyFragment(myViewHolder);