【问题标题】:Difference in how a card view is displayed when defined via XML and defined programatically通过 XML 定义和以编程方式定义时卡片视图显示方式的差异
【发布时间】:2015-04-23 03:54:29
【问题描述】:

我在使用 Android 的新卡片视图时遇到了一个非常令人不安的问题。 我在我的LinearLayout 中用 XML 定义了一张卡片,并以编程方式定义了另一张卡片。

这就是我在 XML 中定义卡片视图的方式。

<android.support.v7.widget.CardView
        android:id="@+id/incoming_call_status_card2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/activity_horizontal_margin">

        <include layout="@layout/common_cards_switch_summery"/>

        </android.support.v7.widget.CardView>

这就是我在 Java 中的做法。

LinearLayout layout = (LinearLayout) view.findViewById(R.id.main_layout);
CardView card = new CardView(getActivity());
View.inflate(getActivity(), R.layout.common_cards_switch_summery, card);
layout.addView(card);

正如您所看到的,两张卡片基本相同,没有任何修改,我在这两种情况下唯一要做的就是使用 XML (R.layout.common_cards_switch_summery) 中定义的布局来扩充卡片视图。

但我得到的最终结果相当奇怪。

可以清楚地看到,在第一张卡中,即用 XML 定义的卡中,有一个显示某种高度的阴影,但在我用 Java 定义的第二张卡中,根本没有显示任何阴影。

当我在 XML 中设置 card_view:cardElevation="5dp" 时,海拔会正确显示。但是当我在 Java 中调用 card.setCardElevation(5); 时,根本没有提升。

有人可以解释背后发生的事情吗?有没有办法让我在以编程方式定义 XML 时获得与 XML 相同的结果?

PS - 在 Lollipop (5.0.1) 上测试

我在 Java 中导入相同的类,即
import android.support.v7.widget.CardView;

【问题讨论】:

  • 使用 Hierarchy View 查看您是否可以确定哪些属性不同(除了边距,您在第一个但第二个没有)。此外,不要尝试View.inflate(),而是尝试getActivity().getLayoutInflater().inflate(),因为View.inflate() 使用LayoutInflater.from(),这几乎不是活动/片段的正确答案。第三,去掉addView(),因为那应该是多余的。

标签: android android-layout android-cardview


【解决方案1】:

在我看来,阴影 显示在您的第二个 cardView 下——只是它被父视图剪切了。第二张卡没有定义marginBottom,这就是两者之间的区别。要么添加边距,要么放大父级并查看结果!

【讨论】:

    【解决方案2】:

    其实你可以用两种方式布局。也许没有有效或适当的方法来衡量xml 布局和java 代码之间的性能差异。 但为了开发方便,我会决定使用 xml 而不是 java 代码。 毕竟,你有 Palette 来立即渲染你的 xml 布局文件。并且在编写xml时有Smart Recommends的小部件属性。你也可以drag and drop widgets。但是你可以在编写java 文件来布局你的小部件时这样做吗?如果结构太复杂,你会写多少行?

    【讨论】:

    • 是的,我同意你的观点,但不幸的是,在我的情况下,我必须根据用户的设备配置动态创建布局。所以我在 xml 的布局中定义常量项并在 java 代码中更改那些。我在尝试这样做时遇到了这个问题。
    【解决方案3】:

    试试这个:

    cardview.setMaxCardElevation(8);
    

    来自CardView 文档:

    如果你想动态改变海拔,你应该在 CardView 初始化时调用 setMaxCardElevation(float)。

    【讨论】:

      猜你喜欢
      • 2016-07-02
      • 2018-11-13
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      相关资源
      最近更新 更多