如何在 Android 上使用内部 FrameLayout 创建自定义 CardView
How to create custom CardView with internal FrameLayout on Android
我需要为 CardView 添加边框,我发现这样做的方法(在 Whosebug 中)是在内部创建一个 FrameLayout 并向其添加形状背景。这种方法效果很好,但现在我需要将其扩展到自定义布局,以避免每次我想使用此 cardviewWithBorders 时都重复此代码!
当前代码如下所示:
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:elevation="4dp"
app:cardCornerRadius="4dp"
app:cardUseCompatPadding="true">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_border_corner_radius"
android:padding="16dp">
<EditText
android:id="@+id/fieldInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:lineSpacingMultiplier="1.5"
android:textAppearance="@style/LatoRegular"
android:textSize="16sp"
tools:hint="Type in your E-mail" />
</FrameLayout>
</android.support.v7.widget.CardView>
我想要的只是拥有一个 CardView 和 FrameLayout 的组件,我可以这样使用它:
<com.example.BorderCardView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<content goes here />
</com.example.BorderCardView>
我该怎么做才能实现这种行为?
你很幸运,你的 "inner" 视图是 FrameLayout
并且 CardView
扩展了 FrameLayout,因为这意味着你不需要担心确切的类型您的子视图的 LayoutParams
个对象。
public class BorderCardView extends CardView {
public BorderCardView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
FrameLayout.LayoutParams params =
new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT);
FrameLayout frame = new FrameLayout(getContext());
frame.setLayoutParams(params);
frame.setBackground(/* your background drawable */);
frame.setPadding(/* your left/top/right/bottom padding */);
while (getChildCount() > 0) {
View child = getChildAt(0);
FrameLayout.LayoutParams childParams =
(FrameLayout.LayoutParams) child.getLayoutParams();
removeView(child);
frame.addView(child);
child.setLayoutParams(childParams);
}
addView(frame);
}
}
您在这里所做的是动态创建您的 "inner" FrameLayout
,然后遍历布局中的所有子项,将它们从 CardView
中移除并将它们添加到FrameLayout
而不是,然后最后将 "inner" 框架添加到 CardView
.
我需要为 CardView 添加边框,我发现这样做的方法(在 Whosebug 中)是在内部创建一个 FrameLayout 并向其添加形状背景。这种方法效果很好,但现在我需要将其扩展到自定义布局,以避免每次我想使用此 cardviewWithBorders 时都重复此代码!
当前代码如下所示:
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:elevation="4dp"
app:cardCornerRadius="4dp"
app:cardUseCompatPadding="true">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_border_corner_radius"
android:padding="16dp">
<EditText
android:id="@+id/fieldInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:lineSpacingMultiplier="1.5"
android:textAppearance="@style/LatoRegular"
android:textSize="16sp"
tools:hint="Type in your E-mail" />
</FrameLayout>
</android.support.v7.widget.CardView>
我想要的只是拥有一个 CardView 和 FrameLayout 的组件,我可以这样使用它:
<com.example.BorderCardView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<content goes here />
</com.example.BorderCardView>
我该怎么做才能实现这种行为?
你很幸运,你的 "inner" 视图是 FrameLayout
并且 CardView
扩展了 FrameLayout,因为这意味着你不需要担心确切的类型您的子视图的 LayoutParams
个对象。
public class BorderCardView extends CardView {
public BorderCardView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
FrameLayout.LayoutParams params =
new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT);
FrameLayout frame = new FrameLayout(getContext());
frame.setLayoutParams(params);
frame.setBackground(/* your background drawable */);
frame.setPadding(/* your left/top/right/bottom padding */);
while (getChildCount() > 0) {
View child = getChildAt(0);
FrameLayout.LayoutParams childParams =
(FrameLayout.LayoutParams) child.getLayoutParams();
removeView(child);
frame.addView(child);
child.setLayoutParams(childParams);
}
addView(frame);
}
}
您在这里所做的是动态创建您的 "inner" FrameLayout
,然后遍历布局中的所有子项,将它们从 CardView
中移除并将它们添加到FrameLayout
而不是,然后最后将 "inner" 框架添加到 CardView
.