2014-03-07 165 views
0

我想創建一個垂直LinearLayout內的兩個TextViews的自定義視圖,但我完全不知道它是如何工作的。android-自定義視圖的寬度和高度爲0

目前沒有出現,因爲我的onDraw方法沒有被調用。我認爲這是由於我的觀點(LinearLayout?)的寬度和高度均爲0.

我認爲我應該覆蓋我的onMeasure,但在嘗試setMeasuredDimension(100,100)後,仍然不是加工。

我想膨脹視圖內的xml並使用兩個TextViews。

解釋也很棒,所以我希望能夠讓我的頭腦明白這一切是如何運作的。

感謝

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); 
} 
+0

可能重複的[Android自定義佈局 - onDraw()永遠不會被調用](http://stackoverflow.com/questions/13056331/android-custom-layout-ondraw-從來沒有被稱爲) – Simon

回答

0

隨着你是前趨勢ViewGroup,你應該覆蓋dispatchDraw(),而不是onDraw()

+0

好吧,我看到dispatchDraw被調用,但我仍然不明白我如何給這些視圖的大小?這一切似乎都基於我在onMeasure中的內容,但我希望使用match_parent和wrap_content的值。我如何申請他們? –

+0

您無法重寫它們,只需讓框架通過在佈局XML中指定大小來處理它,就像處理其他視圖一樣。如果方法未被覆蓋,則將調用基類方法。 – Simon

+0

這就是我之前所嘗試的,正如你從我添加的xml中看到的那樣,但是沒有任何東西被繪製。任何想法爲什麼? –

相關問題