setMargins方法不适用于自定义ViewGroup

时间:2015-10-24 11:03:36

标签: java android android-custom-view viewgroup

我正在开发一个项目,我的工作部分是在主屏幕上创建一个滑动布局,当应用程序启动时,它将部分显示在底部,我们可以滚动该布局。然后我必须在其中添加子视图,这将是卡片。为此,我创建了一个自定义FrameLayout,我将以编程方式添加它们。

我已成功完成任务的大部分工作。

我为滑动布局创建了一个自定义<?xml version="1.0" encoding="utf-8"?> <com.dhrumil.airhockey.OverflowView xmlns:android="http://schemas.android.com/apk/res/android" android:background="@drawable/layer_list" android:padding="5dp" android:layout_height="match_parent"/>

然后我使用它并以XML格式添加。

MyCardView

之后我创建了一个名为ViewGroup的java类,它会释放public class MyCardView extends ViewGroup { public MyCardView(Context context){ super(context); init(context); } public MyCardView(Context context, AttributeSet attrs){ super(context,attrs); init(context); } public MyCardView(Context context, AttributeSet attrs, int defStyleAttr){ super(context, attrs,defStyleAttr); init(context); } public MyCardView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(context); } public void init(Context context){ } @Override protected void onLayout(boolean b, int l, int i1, int i2, int i3) { // TODO Auto-generated method stub final int count = getChildCount(); int curWidth, curHeight, curLeft, curTop, maxHeight; //get the available size of child view int childLeft = this.getPaddingLeft(); int childTop = this.getPaddingTop(); int childRight = this.getMeasuredWidth() - this.getPaddingRight(); int childBottom = this.getMeasuredHeight() - this.getPaddingBottom(); int childWidth = childRight - childLeft; int childHeight = childBottom - childTop; maxHeight = 0; curLeft = childLeft; curTop = childTop; //walk through each child, and arrange it from left to right for (int i = 0; i < count; i++) { View child = getChildAt(i); if (child.getVisibility() != GONE) { //Get the maximum size of the child child.measure(MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.AT_MOST)); curWidth = child.getMeasuredWidth(); curHeight = child.getMeasuredHeight(); //wrap is reach to the end if (curLeft + curWidth >= childRight) { curLeft = childLeft; curTop += maxHeight; maxHeight = 0; } //do the layout child.layout(curLeft, curTop, curLeft + curWidth, curTop + curHeight); //store the max height if (maxHeight < curHeight) maxHeight = curHeight; curLeft += curWidth; } } } }

MyCardView

然后我尝试以编程方式将FrameLayout的对象添加到我的自定义onCreate()中。

这是完成任务的ViewGroup内部的方法。这是将两个自定义LinearLayout添加到一个public void setupText(){ FrameLayout frame = (FrameLayout) findViewById(R.id.overflow_frame); LinearLayout linearLayout = new LinearLayout(getBaseContext()); linearLayout.setOrientation(LinearLayout.VERTICAL); ViewGroup vg = new MyCardView(getBaseContext()); ViewGroup.MarginLayoutParams layoutParams = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,200); vg.setBackgroundColor(Color.WHITE); ViewCompat.setElevation(vg, 5); TextView tvTemp = new TextView(getBaseContext()); tvTemp.setTextColor(Color.BLACK); tvTemp.setText("Hello There"); vg.addView(tvTemp); ViewGroup vg1 = new MyCardView(getBaseContext()); ViewGroup.MarginLayoutParams layoutParams1 = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,200); layoutParams1.setMargins(0,10,0,0); vg1.setBackgroundColor(Color.WHITE); ViewCompat.setElevation(vg1, 5); TextView tvTemp1 = new TextView(getBaseContext()); tvTemp1.setTextColor(Color.BLACK); tvTemp1.setText("Hello There 2"); vg1.addView(tvTemp1); linearLayout.addView(vg,layoutParams); linearLayout.addView(vg1,layoutParams1); frame.addView(linearLayout); }

{{1}}

现在发生的事情是我试图设置ViewGroup的边距,但似乎并不适用。请帮助。

1 个答案:

答案 0 :(得分:2)

我正在做的错误是,在我的代码中,我声明了ViewGroup.MarginLayoutParams layoutParams1的实例,我在linearLayout.addView(vg1,layoutParams1)中传递相同的实例,但方法addView()接受View }作为第一个参数,LayoutParams的实例作为第二个参数。

所以我认为那是问题(不完全确定)。所以我将代码更改为

LinearLayout.LayoutParams layoutParams1 = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,200);