使用ScrollView时,自定义设计的视图消失了

时间:2013-03-11 10:24:47

标签: android android-layout android-scrollview

我在Android中使用一个自定义设计的CalendarView。我在布局中使用Scrollview时,自定义设计的CalendarView未显示在屏幕上。

什么可能导致CalendarView消失?

我的布局是:

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

    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <Button
            android:id="@+id/NextMonth"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="@string/NextMonth" />

        <Button
            android:id="@+id/PreviousMonth"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:text="@string/PreviousMonth" />

        <TextView
            android:id="@+id/MonthText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:text="Month" />

        <TextView
            android:id="@+id/SundayText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/PreviousMonth"
            android:layout_marginLeft="25dp"
            android:text="@string/SundayText"
            android:textSize="10sp" />

        <TextView
            android:id="@+id/MondayText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/PreviousMonth"
            android:layout_marginLeft="22dp"
            android:layout_toRightOf="@+id/SundayText"
            android:text="@string/MondayText"
            android:textSize="10sp" />

        <TextView
            android:id="@+id/TuesdayText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/PreviousMonth"
            android:layout_marginLeft="20dp"
            android:layout_toRightOf="@+id/MondayText"
            android:text="@string/Tuesday"
            android:textSize="10sp" />

        <TextView
            android:id="@+id/WednesdayText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/PreviousMonth"
            android:layout_marginLeft="22dp"
            android:layout_toRightOf="@+id/TuesdayText"
            android:text="@string/Wednesday"
            android:textSize="10sp" />

        <TextView
            android:id="@+id/Thursday"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/PreviousMonth"
            android:layout_marginLeft="20dp"
            android:layout_toRightOf="@+id/WednesdayText"
            android:text="@string/ThurdayText"
            android:textSize="10sp" />

        <TextView
            android:id="@+id/Friday"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/PreviousMonth"
            android:layout_marginLeft="22dp"
            android:layout_toRightOf="@+id/Thursday"
            android:text="@string/FridayText"
            android:textSize="10sp" />

        <TextView
            android:id="@+id/Saturday"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/PreviousMonth"
            android:layout_marginLeft="27dp"
            android:layout_toRightOf="@+id/Friday"
            android:text="@string/SaturdayText"
            android:textSize="10sp" />

        <com.example.calendar_module.CalendarView
            android:id="@+id/calendar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/NextMonth" />
    </RelativeLayout>

</ScrollView>

我的CalenderView类文件:

package com.example.calendar_module;

import java.util.Calendar;

import android.app.ActionBar.LayoutParams;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.MonthDisplayHelper;
import android.view.MotionEvent;
import android.widget.ImageView;

public class CalendarView extends ImageView {

private static int WEEK_TOP_MARGIN = 0;
private static int WEEK_LEFT_MARGIN = 05;
private static int CELL_WIDTH = 20;
private static int CELL_HEIGH = 20;
private static int CELL_MARGIN_TOP = 05;
private static int CELL_MARGIN_LEFT = 29;
private static float CELL_TEXT_SIZE;

private static final String TAG = "CalendarView"; 
private String[] mDayString = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
private Calendar mRightNow = null;
private Drawable mWeekTitle = null;
private Cell mToday = null;
private Cell[][] mCells = new Cell[6][7];
private Cell[] mDayCells = new Cell[7];
private OnCellTouchListener mOnCellTouchListener = null;
MonthDisplayHelper mHelper;
Drawable mDecoration = null;

public interface OnCellTouchListener {
    public void onTouch(Cell cell);
    }

public CalendarView(Context context) {
    this(context, null);
}

public CalendarView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public CalendarView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    mDecoration = context.getResources().getDrawable(R.drawable.typeb_calendar_today);      
    initCalendarView();
}

private void initCalendarView() {
    mRightNow = Calendar.getInstance();
    // prepare static vars
    Resources res = getResources();
    WEEK_TOP_MARGIN  = (int) res.getDimension(R.dimen.week_top_margin);
    WEEK_LEFT_MARGIN = (int) res.getDimension(R.dimen.week_left_margin);

    CELL_WIDTH = (int) res.getDimension(R.dimen.cell_width);
    CELL_HEIGH = (int) res.getDimension(R.dimen.cell_heigh);
    CELL_MARGIN_TOP = (int) res.getDimension(R.dimen.cell_margin_top);
    CELL_MARGIN_LEFT = (int) res.getDimension(R.dimen.cell_margin_left);

    CELL_TEXT_SIZE = res.getDimension(R.dimen.cell_text_size);
    // set background
        //      setImageResource(R.drawable.background);
    mWeekTitle = res.getDrawable(R.drawable.calendar_week);

    mHelper = new MonthDisplayHelper(mRightNow.get(Calendar.YEAR), mRightNow.get(Calendar.MONTH));

     }

private void initCells() {

    class _calendar {
        public int day;
        public boolean thisMonth;
        public _calendar(int d, boolean b) {
            day = d;
            thisMonth = b;
        }
        public _calendar(int d) {
            this(d, false);
        }
    };
    _calendar tmp[][] = new _calendar[6][7];

    for(int i=0; i<tmp.length; i++) {
        int n[] = mHelper.getDigitsForRow(i);
        for(int d=0; d<n.length; d++) {
            if(mHelper.isWithinCurrentMonth(i,d))
                tmp[i][d] = new _calendar(n[d], true);
            else
                tmp[i][d] = new _calendar(n[d]);

        }
    }

    Calendar today = Calendar.getInstance();
    int thisDay = 0;
    mToday = null;
    if(mHelper.getYear()==today.get(Calendar.YEAR) && mHelper.getMonth()==today.get(Calendar.MONTH)) {
        thisDay = today.get(Calendar.DAY_OF_MONTH);
    }


    //      // build cells
    Rect Bound = new Rect(CELL_MARGIN_LEFT, CELL_MARGIN_TOP, CELL_WIDTH+CELL_MARGIN_LEFT, CELL_HEIGH+CELL_MARGIN_TOP);
   //       for( int i=0 ; i < 7 ; i++ )
   //       {
   //           
  //            mDayCells[i] = new Cell(mDayString[i],new Rect(Bound),CELL_TEXT_SIZE);
  //            Bound.offset(CELL_WIDTH, 0);
  //            
  //        }
 //     
 //     Bound.offset(0, CELL_HEIGH);      // move to next row and first column
 //     Bound.left = CELL_MARGIN_LEFT;
 //     Bound.right = CELL_MARGIN_LEFT+CELL_WIDTH;
 //     

    for(int week=0; week<mCells.length; week++) {
        for(int day=0; day<mCells[week].length; day++) 
        {

            if(tmp[week][day].thisMonth) {
                if(day==0 || day==6 )
                    mCells[week][day] = new RedCell(tmp[week][day].day, new Rect(Bound), CELL_TEXT_SIZE);
                else 
                    mCells[week][day] = new Cell(tmp[week][day].day, new Rect(Bound), CELL_TEXT_SIZE);
            } else {

                mCells[week][day] = new GrayCell(tmp[week][day].day, new Rect(Bound), CELL_TEXT_SIZE);
            }

            Bound.offset(CELL_WIDTH, 0); // move to next column 

            // get today
            if(tmp[week][day].day==thisDay && tmp[week][day].thisMonth) {
                mToday = mCells[week][day];
                mDecoration.setBounds(mToday.getBound());
            }
        }
        Bound.offset(0, CELL_HEIGH); // move to next row and first column
        Bound.left = CELL_MARGIN_LEFT;
        Bound.right = CELL_MARGIN_LEFT+CELL_WIDTH;

    }       
  }

@Override
public void onLayout(boolean changed, int left, int top, int right, int bottom) {
  //        Rect re = getDrawable().getBounds();
 //     WEEK_LEFT_MARGIN = CELL_MARGIN_LEFT = (right-left - re.width()) / 2;
 //     mWeekTitle.setBounds(WEEK_LEFT_MARGIN, WEEK_TOP_MARGIN, WEEK_LEFT_MARGIN+mWeekTitle.getMinimumWidth(), WEEK_TOP_MARGIN+mWeekTitle.getMinimumHeight());

    initCells();
    super.onLayout(changed, left, top, right, bottom);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(CELL_WIDTH, CELL_HEIGH);
}

 public void setTimeInMillis(long milliseconds) {
    mRightNow.setTimeInMillis(milliseconds);
    initCells();
    this.invalidate();
 }

public int getYear() {
    return mHelper.getYear();
}

public int getMonth() {
    return mHelper.getMonth();
}

public void nextMonth() {
    mHelper.nextMonth();
    initCells();
    invalidate();
}

public void previousMonth() {
    mHelper.previousMonth();
    initCells();
    invalidate();
}

public boolean firstDay(int day) {
    return day==1;
}

public boolean lastDay(int day) {
    return mHelper.getNumberOfDaysInMonth()==day;
}

public void goToday() {
    Calendar cal = Calendar.getInstance();
    mHelper = new MonthDisplayHelper(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH));
    initCells();
    invalidate();
}

public Calendar getDate() {
    return mRightNow;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if(mOnCellTouchListener!=null){
        for(Cell[] week : mCells) {
            for(Cell day : week) {
                if(day.hitTest((int)event.getX(), (int)event.getY())) {
                    mOnCellTouchListener.onTouch(day);
                }                       
            }
        }
    }
    return super.onTouchEvent(event);
}

public void setOnCellTouchListener(OnCellTouchListener p) {
    mOnCellTouchListener = p;
}

@Override
protected void onDraw(Canvas canvas) {
    // draw background
    super.onDraw(canvas);
    mWeekTitle.draw(canvas);

    // draw cells
    for(Cell[] week : mCells) {
        for(Cell day : week) {
            day.draw(canvas);           
        }
    }

    // draw today
    if(mDecoration!=null && mToday!=null) {
        mDecoration.draw(canvas);
    }
}

public class GrayCell extends Cell {
    public GrayCell(int dayOfMon, Rect rect, float s) {
        super(dayOfMon, rect, s);
        mPaint.setColor(Color.LTGRAY);
    }           
}

private class RedCell extends Cell {

    public RedCell(int dayOfMon, Rect rect, float s) {
        super(dayOfMon, rect, s);
        mPaint.setColor(0xdddd0000);
    }           

}


}

1 个答案:

答案 0 :(得分:0)

我认为,您的自定义height的{​​{1}}等于== 0.尝试记录它。如果它是正确的,只需覆盖view并设置onMeasure的大小。

并且esle:为什么在xml view?你能想象它在height == match_parent中的样子吗?)

UPD:好的,在您的情况下ScrollView。您的自定义height == 0中必须使用override onMeasure()方法,如下所示:

view

宽度和高度值,以像素为单位。

祝你好运!