我有一个ListFragment,它在屏幕上生成一个“卡片”列表,如下所示:
ListFragment使用RelativeLayout呈现每张卡片:
<RelativeLayout
style="@style/CardDefault">
... many other elements here
</RelativeLayout>
卡的完整XML(上面)实际上非常冗长,因为卡中有更多项目不在屏幕截图中。我省略了额外的东西,因为它很冗长。
卡的风格如下:
<style name="Card">
<item name="android:background">@drawable/card</item>
<item name="android:textColor">@color/card_text_default</item>
<item name="android:layout_height">match_parent</item>
<item name="android:layout_width">match_parent</item>
<item name="android:padding">16dp</item>
</style>
卡片的默认颜色为蓝色,显示在我上面链接的屏幕截图的顶部。一旦卡完成,它将获得绿色样式 - 上面屏幕截图中的底部卡片。
我想简单地用蓝色样式替换蓝色样式(如上所示)。样式切换将在视图首次加载时发生 - 当用户正在查看此屏幕时,不会发生这种情况。
我一直在玩不同的方法来做到这一点,但似乎无法弄清楚最佳做法是什么。
使用完全不同的布局xml文件仅仅引用不同的样式属性似乎很浪费。特别是,当我的布局xml文件非常冗长时,正如我所提到的那样。
对我来说,改变这种相对布局风格的最佳方法是什么?
编辑 - 01/27
我已经学到了更多关于Android的知识,并且有更多细节。我想做类似以下代码的事情 - if块中的注释是伪代码:
private class PrescriptionCardAdapter extends ArrayAdapter<Prescription> {
public PrescriptionCardAdapter(List<Prescription> prescriptions) {
super(getActivity(), R.layout.activity_fragment, prescriptions);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (null == convertView) {
if (cardState == "complete") {
// apply the COMPLETE theme or style to this specific view
convertView = getActivity().getLayoutInflater().inflate(R.layout.prescription_card, null);
}
else if (cardState == "overdue") {
// apply the OVERDUE theme or style to this specific view
convertView = getActivity().getLayoutInflater().inflate(R.layout.prescription_card, null);
}
else {
// apply the DEFAULT theme or style to this specific view
convertView = getActivity().getLayoutInflater().inflate(R.layout.prescription_card, null);
}
}
return convertView;
}
}
有没有一种方法可以将我的观点应用主题或风格,因为它们会让它们膨胀? Greg,我可以在上面的代码中使用AttributeSets做些什么吗?
谢谢!