创建Card

编写: roya 原文:https://developer.android.com/training/wearables/ui/cards.html

Card在不同的应用上以一致的外观为用户显示信息。这个章节介绍如何在Android Wear应用中创建Card。

Wearable UI库提供了为穿戴设备特别设计的Card实现。这个库包含了CardFrame类,它将view包在一个Card风格的框架中,该框架有白色的背景、圆角和光投射阴影。CardFrame只能包含一个直接子类,通常是一个layout管理器,我们可以向它添加其他views以定制Card内容。

你有两种方法向应用添加Card:

  • 使用或继承CardFragment类。
  • 在layout的CardScrollView中添加一个Card。

Note: 这个课程展示了如何在Android Wear activities中添加Card。Android可穿戴设备上的notifications同样以Card的形式显示。更多信息请查看为Notification赋加可穿戴特性

创建Card Fragment

CardFragment类提供一个默认的Card layout,该layout含有一个标题、描述文字和一个图标。如果figure 1的默认Card layout符合你的要求,那么使用这个方法向你的app添加Card。

Figure 1

Figure 1. 默认的CardFragment layout.

为了添加一个CardFragment到应用中,我们需要:

  • 在layout中,为包含Card的节点分配一个ID
  • 在activity中,创建一个CardFragment实例
  • 使用fragment管理器将CardFragment实例添加到它的容器

下面的示例代码显示了Figure 1中的屏幕显示代码:

  1. <android.support.wearable.view.BoxInsetLayout
  2. xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:background="@drawable/robot_background"
  5. android:layout_height="match_parent"
  6. android:layout_width="match_parent">
  7. <FrameLayout
  8. android:id="@+id/frame_layout"
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent"
  11. app:layout_box="bottom">
  12. </FrameLayout>
  13. </android.support.wearable.view.BoxInsetLayout>

下面的代码添加CardFragment实例到Figure 1的activity中:

  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.activity_wear_activity2);
  4. FragmentManager fragmentManager = getFragmentManager();
  5. FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  6. CardFragment cardFragment = CardFragment.create(getString(R.string.cftitle),
  7. getString(R.string.cfdesc),
  8. R.drawable.p);
  9. fragmentTransaction.add(R.id.frame_layout, cardFragment);
  10. fragmentTransaction.commit();
  11. }

为了使用CardFragment创建一个带有自定义layout的Card,需要继承这个类和重写它的onCreateContentView方法。

添加CardFrame到Layout

我们也可以直接添加一个Card到layout中,如figure 2所示。当希望为layout文件中的Card自定义一个layout时,使用这个方法。

创建Card - 图2

Figure 2. 添加一个CardFrame到layout.

下面的layout代码例子示范了一个含有两个节点的垂直linear layout。你可以创建更加复杂的layouts以适合你应用的需要。

  1. <android.support.wearable.view.BoxInsetLayout
  2. xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:background="@drawable/robot_background"
  5. android:layout_height="match_parent"
  6. android:layout_width="match_parent">
  7. <android.support.wearable.view.CardScrollView
  8. android:id="@+id/card_scroll_view"
  9. android:layout_height="match_parent"
  10. android:layout_width="match_parent"
  11. app:layout_box="bottom">
  12. <android.support.wearable.view.CardFrame
  13. android:layout_height="wrap_content"
  14. android:layout_width="fill_parent">
  15. <LinearLayout
  16. android:layout_height="wrap_content"
  17. android:layout_width="match_parent"
  18. android:orientation="vertical"
  19. android:paddingLeft="5dp">
  20. <TextView
  21. android:fontFamily="sans-serif-light"
  22. android:layout_height="wrap_content"
  23. android:layout_width="match_parent"
  24. android:text="@string/custom_card"
  25. android:textColor="@color/black"
  26. android:textSize="20sp"/>
  27. <TextView
  28. android:fontFamily="sans-serif-light"
  29. android:layout_height="wrap_content"
  30. android:layout_width="match_parent"
  31. android:text="@string/description"
  32. android:textColor="@color/black"
  33. android:textSize="14sp"/>
  34. </LinearLayout>
  35. </android.support.wearable.view.CardFrame>
  36. </android.support.wearable.view.CardScrollView>
  37. </android.support.wearable.view.BoxInsetLayout>

CardScrollView的内容小于容器时,这个例子上的CardScrollView节点让我们可以配置Card的gravity,。这个例子是Card对齐屏幕底部:

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_wear_activity2);
  5. CardScrollView cardScrollView =
  6. (CardScrollView) findViewById(R.id.card_scroll_view);
  7. cardScrollView.setCardGravity(Gravity.BOTTOM);
  8. }

CardScrollView检测屏幕形状后以不同的显示方式在圆形或方形设备上显示Card(在圆形屏幕上使用更宽的侧边缘。不管怎样,在BoxInsetLayout中放置CardScrollView节点然后使用layout_box="bottom"属性,这对圆形屏幕上的Card对齐底部并且没有内容被剪裁是很有用的。