【问题标题】:android - custom view has width and height of 0android - 自定义视图的宽度和高度为 0
【发布时间】:2014-03-07 15:17:07
【问题描述】:

我正在尝试在垂直 LinearLayout 中创建一个包含两个 TextView 的自定义视图,但我完全不知道它是如何工作的。

目前什么都没有出现,因为我的 onDraw 方法没有被调用。我认为这是因为我的视图(LinearLayout?)的宽度和高度均为 0。

我认为我应该覆盖我的 onMeasure,但在尝试 setMeasuredDimension(100,100) 之后,这仍然无法正常工作。

我正在尝试在视图中填充 xml 并在其中使用两个 TextView。

一个解释也很好,所以我希望能弄清楚这一切是如何运作的。

谢谢

size_button.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

<TextView
    android:id="@+id/sizeButtonSizeText"
    android:layout_width="wrap_content"
    android:layout_height="match_parent" />

<TextView
    android:id="@+id/sizeButtonSlugText"
    android:layout_width="wrap_content"
    android:layout_height="match_parent" />

</LinearLayout>

SizeButton.java

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View.MeasureSpec;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.nap.library.NapApplication;
import com.nap.library.R;

public class SizeButton extends LinearLayout {

    private TextView mSize;
    private TextView mSlug;
    private String mSizeText;
    private String mSlugText;
    private Paint mPaint;
    private boolean mSoldOut;
    private Context mContext;

    /*
    public SizeButton(Context context) {
        super(context);
        setup();
    }

    public SizeButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        setup();
    }
    */

    public SizeButton(Context context, String size, String slug) {
        super(context);
        mContext = context;
        mSizeText = size;
        mSlugText = slug;
        setup();
    }

    public void setSoldOut(){
        this.mSoldOut = true;
    }

    public boolean isSoldOut(){
        return mSoldOut;
    }

    public void setSizeText(String size){
        mSize.setText(size);
    }

    public void setSlugText(String slug){
        mSlug.setText(slug);
    }

    public void setup(){
        mPaint = new Paint();


        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LinearLayout buttonLayout = (LinearLayout) inflater.inflate(R.layout.size_button, null);
        mSize = (TextView) buttonLayout.findViewById(R.id.sizeButtonSizeText);
        mSize.setGravity(Gravity.CENTER);
        mSize.setTextColor(Color.BLACK);
        mSize.setText(mSizeText);
        mSize.setTypeface(NapApplication.mPorter);
        mSize.setWidth(10);
        mSlug = (TextView) buttonLayout.findViewById(R.id.sizeButtonSlugText);
        mSlug.setGravity(Gravity.CENTER);
        mSlug.setTextColor(Color.BLACK);
        mSlug.setText(mSlugText);
        mSlug.setTypeface(NapApplication.mPorter);
        invalidate();
        requestLayout();

        LinearLayout.LayoutParams layoutParams =  new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
        mSize.setLayoutParams(layoutParams);
        mSlug.setLayoutParams(layoutParams);
        Log.i("button","in setup");
        Log.i("button","width = "+this.getWidth()+" height = "+this.getHeight());
        Log.i("button","width = "+mSize.getWidth()+" sizeheight = "+mSize.getHeight());
        Log.i("button","width = "+mSlug.getWidth()+" slugheight = "+mSlug.getHeight());
  }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Log.i("button","in onMeasure");
        setMeasuredDimension(100,100);
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Log.i("button","in ondraw");
    }


}

ProductFragment.java - 将按钮添加到片段的位置

for (int i = 0; i < mItem.getSizes().length; i++) {
    final SizeButton sizeButton = new SizeButton(getActivity(),mItem.getSizes()[i],"hello");

    // Each size button has a sku set as its tag
    sizeButton.setTag(mItem.getSkus()[i]);
    sizeButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if(mItem.getSizes().length > 1) {
            boolean selected = !sizeButton.isSelected();
            if (selected) {
                mCurrentSku = (String) v.getTag();
            } else {
                mCurrentSku = null;
            }
            }
        configureButtons();
        }
    });
    Log.e("button","Adding button to view");
    mSizesWrapper.addView(sizeButton);
}

【问题讨论】:

标签: android android-custom-view ondraw onmeasure


【解决方案1】:

当您扩展 ViewGroup 时,您应该覆盖 dispatchDraw(),而不是 onDraw()

【讨论】:

  • 好的,我看到 dispatchDraw 被调用了,但是我还是不明白我是怎么给这些视图一个大小的?这一切似乎都基于我在 onMeasure 中输入的内容,但我希望使用 match_parent 和 wrap_content 的值。我该如何应用它们?
  • 您不能覆盖它们,而只是让框架通过在布局 XML 中指定大小来处理它,就像您对任何其他视图所做的那样。如果一个方法没有被覆盖,基类的方法将被调用。
  • 这就是我之前尝试过的,正如您从我添加的 xml 中看到的那样,但没有绘制任何内容。知道为什么吗?
  • 您不应该在其构造函数中设置视图大小(您通过调用 setup 来完成),因为视图的父级在添加时要求它测量自身,而不是在构造时。有 3 种方法可以做到这一点。在代码中创建它并将其设置为LayoutParams(不在视图中,在消费者中)。 2. 像任何其他视图一样在 XML 中。 3. 在 onMeasure() 中。 stackoverflow.com/questions/12266899/…
  • 对不起,我真的没有得到这个(可能是星期五下午 5:40)我不明白什么是“消费者”?因此,如果我没有在 setup 中设置大小,那么我在哪里做呢?我在哪里扩充我的 xml 布局?
猜你喜欢
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 2017-01-20
  • 2011-06-29
  • 1970-01-01
  • 2011-08-21
相关资源
最近更新 更多