我有以下design。
如您所见,工作日文本和“列标题”图像未与GridView项目对齐。
以下是完整的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="11"
tools:context="com.test.me.fragments.patientResume">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="4"
android:background="@drawable/gradient">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:id="@+id/aboveLights"
android:src="@mipmap/above_lights"
android:contentDescription="@string/above_lights" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@mipmap/under_lights"
android:contentDescription="@string/under_lights" />
<com.test.dashboard.view.CircleImageView
android:id="@+id/centerImg"
android:layout_width="104dp"
android:layout_height="104dp"
android:layout_centerInParent="true"
android:background="@mipmap/ic_default_avatar" />
<com.test.dashboard.view.widget.RobotoLightTextView
android:id="@+id/PatientName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/aboveLights"
android:layout_alignTop="@id/aboveLights"
android:layout_alignRight="@id/aboveLights"
android:layout_alignBottom="@id/aboveLights"
android:layout_margin="1dp"
android:gravity = "center_horizontal"
android:textSize="20sp"
android:text="Mauricio Affonso"
android:textColor="@color/colorPrimaryDark" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="25dp">
<com.test.dashboard.view.widget.RobotoLightTextView
android:id="@+id/took_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/took"
android:textColor="@color/colorPrimaryDark" />
<com.test.dashboard.view.widget.RobotoLightTextView
android:id="@+id/took_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/took_header"
android:gravity="center"
android:text="-"
android:textAlignment="center"
android:textColor="@color/colorPrimaryDark"
android:textSize="25sp" />
</RelativeLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="20dp">
<com.test.dashboard.view.widget.RobotoLightTextView
android:id="@+id/missed_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/missed"
android:textColor="@color/colorPrimaryDark" />
<com.test.dashboard.view.widget.RobotoLightTextView
android:id="@+id/missed_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/missed_header"
android:layout_alignRight="@+id/missed_header"
android:layout_below="@+id/missed_header"
android:gravity="center"
android:text="-"
android:textColor="@color/colorPrimaryDark"
android:textSize="25sp" />
</RelativeLayout>
<com.test.me.wave.WavesView
android:id="@+id/waves_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="25dp"
android:background="#ddf7ff">
<com.test.dashboard.view.widget.RobotoLightTextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/countPatient"
android:textAlignment="center"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:textColor="@color/colorPrimaryDark"
android:text="1 OF 1"
/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/titleImages"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/backgroundLight">
<ImageView
android:id="@+id/morning"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:maxWidth="30dp"
android:maxHeight="30dp"
android:scaleType="fitCenter"
android:src="@mipmap/ic_morning" />
<ImageView
android:id="@+id/noon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:maxWidth="30dp"
android:maxHeight="30dp"
android:src="@mipmap/ic_noon" />
<ImageView
android:id="@+id/evening"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:maxWidth="30dp"
android:maxHeight="30dp"
android:src="@mipmap/ic_evening" />
<ImageView
android:id="@+id/bedtime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:maxWidth="30dp"
android:maxHeight="30dp"
android:src="@mipmap/ic_bedtime" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="7"
android:id="@+id/tableContainer"
android:background="@color/backgroundLight">
<GridView
android:id="@+id/grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/date_layout"
android:layout_margin="@dimen/activity_horizontal_margin"
android:gravity="center"
android:horizontalSpacing="10dp"
android:numColumns="4"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:stretchMode="columnWidth"
android:verticalSpacing="5dp" />
<com.test.me.grid.DateLayout
android:id="@+id/date_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="5dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignTop="@+id/grid"
android:layout_marginTop="30dp"
android:id="@+id/Sun"
android:textColor="@color/colorPrimaryDark"
android:layout_marginLeft="7dp"
android:text="SUN" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignTop="@+id/grid"
android:layout_marginTop="75dp"
android:textColor="@color/colorPrimaryDark"
android:layout_marginLeft="7dp"
android:id="@+id/Mon"
android:text="MON" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignTop="@+id/grid"
android:layout_marginTop="120dp"
android:textColor="@color/colorPrimaryDark"
android:layout_marginLeft="7dp"
android:id="@+id/Tue"
android:text="TUE" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignTop="@+id/grid"
android:layout_marginTop="167dp"
android:textColor="@color/colorPrimaryDark"
android:layout_marginLeft="7dp"
android:id="@+id/Wed"
android:text="WED" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignTop="@+id/grid"
android:layout_marginTop="215dp"
android:textColor="@color/colorPrimaryDark"
android:layout_marginLeft="7dp"
android:id="@+id/Thu"
android:text="THU" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignTop="@+id/grid"
android:layout_marginTop="260dp"
android:textColor="@color/colorPrimaryDark"
android:layout_marginLeft="7dp"
android:id="@+id/Fri"
android:text="FRI" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignTop="@+id/grid"
android:layout_marginTop="310dp"
android:textColor="@color/colorPrimaryDark"
android:layout_marginLeft="7dp"
android:id="@+id/Sat"
android:text="SAT" />
</RelativeLayout>
</LinearLayout>
正如您所看到的,RelativeLayout titleImages的内容和周日文本应该与GridView项目对齐,但我在不同的手机分辨率上有不同的结果。我甚至试图动态改变立场:
int test[] = new int[2];
int space = grid.getHorizontalSpacing();
int height = grid.getMeasuredHeight() / 7;
int Width = grid.getColumnWidth() / 2;
int paddingTop = grid.getPaddingTop();
int paddingLeft = grid.getPaddingLeft();
Resources r = getResources();
float spacePx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, space + 10, r.getDisplayMetrics()) ;
float paddingTopPx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, paddingTop - 7, r.getDisplayMetrics());
float paddingLeftPx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, paddingLeft - 12, r.getDisplayMetrics());
grid.getLocationInWindow(test);
for(int i = 0; i < 7; i++){
Days[i].setY(paddingTopPx + (test[1] - grid.getMeasuredHeight()) + ((i +1)* (height)));
}
for(int i = 0; i < 4; i++){
icons[i].setX((paddingLeftPx + test[0]) + (i) * (spacePx + Width));
}
答案 0 :(得分:1)
我使用不同的布局进行了检查,但看起来并不完美,所以制作视图的最佳方法是使用单一gridview。几乎成功,但你必须处理更多的逻辑才能得到你需要的东西
<GridView
android:id="@+id/grid_calender"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="30dp"
android:paddingRight="30dp"
android:numColumns="5"
android:verticalSpacing="0dp" />
day_view
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="5dp">
<TextView
android:id="@+id/tv_new"
android:layout_width="@dimen/text_height_width"
android:layout_height="@dimen/text_height_width"
android:layout_centerInParent="true"
android:gravity="center"
android:text=""
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@android:color/darker_gray" />
</RelativeLayout>
根据需要创建具有更好逻辑的适配器,编辑代码,忽略注释代码谢谢
public class CustomCalendarAdapter extends BaseAdapter {
static final int FIRST_DAY_OF_WEEK = 0;
public ArrayList<Day> dayList = new ArrayList<>();
String[] days;
Context context;
List<Boolean> event_status;
// Calendar local_cal_30 = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
Calendar cal;
public CustomCalendarAdapter(Context context, ArrayList<Day> dayList, List<Boolean> _event_status, Calendar cal) {
this.context = context;
this.dayList = dayList;
this.event_status = _event_status;
this.cal = cal;
cal.set(Calendar.DAY_OF_MONTH, 1);
refreshDays();
}
@Override
public int getCount() {
return days.length;
}
@Override
public Object getItem(int position) {
return dayList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
// public int getPrevMonth(){
// if(cal.get(Calendar.MONTH) == cal.getActualMinimum(Calendar.MONTH)){
// cal.set(Calendar.YEAR, cal.get(Calendar.YEAR-1));
// }else{
//
// }
// int month = cal.get(Calendar.MONTH);
// if(month == 0){
// return month = 11;
// }
//
// return month-1;
// }
public int getMonth() {
return cal.get(Calendar.MONTH);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View v = convertView;
LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (position % 5 == 0) {
v = vi.inflate(R.layout.day_view, null);
TextView day = (TextView) v.findViewById(R.id.tv_new);
if (position / 5 == 0) {
day.setText(R.string.sunday);
} else if (position / 5 == 1) {
day.setText(R.string.monday);
} else if (position / 5 == 2) {
day.setText(R.string.tuesday);
} else if (position / 5 == 3) {
day.setText(R.string.wednesday);
} else if (position / 5 == 4) {
day.setText(R.string.thursday);
} else if (position / 5 == 5) {
day.setText(R.string.friday);
} else if (position / 5 == 6) {
day.setText(R.string.saturday);
}
} else {
Calendar cal = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
Day dayObject = dayList.get(position);
v = vi.inflate(R.layout.day_view, null);
// RelativeLayout rl_outerView = (RelativeLayout) v.findViewById(R.id.rl);
// FrameLayout today = (FrameLayout) v.findViewById(R.id.today_frame);
// FrameLayout event = (FrameLayout) v.findViewById(R.id.event_frame);
// FrameLayout disable_frame = (FrameLayout) v.findViewById(R.id.disable_frame);
// FrameLayout selected_frame = (FrameLayout) v.findViewById(R.id.selected_frame);
TextView tv_date = (TextView) v.findViewById(R.id.tv_new);
Calendar local_cal = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
tv_date.setVisibility(View.VISIBLE);
// rl_outerView.setVisibility(View.VISIBLE);
// selected_frame.setVisibility(View.GONE);
if (dayObject.getDay() == 0) {
// rl_outerView.setVisibility(View.GONE);
} else {
tv_date.setVisibility(View.VISIBLE);
tv_date.setText(String.valueOf(dayObject.getDay()));//sets the date
}
//Only show 30 days from current date
// if ((dayObject.getDay()<local_cal.get(Calendar.DAY_OF_MONTH) &&
// dayObject.getMonth() == local_cal.get(Calendar.MONTH)) || ((dayObject.getMonth() == local_cal_30.get(Calendar.MONTH))&&
// dayObject.getDay()>local_cal_30.get(Calendar.DAY_OF_MONTH))) {
//Only show upcoming dates from current date
if ((dayObject.getDay() < local_cal.get(Calendar.DAY_OF_MONTH) &&
dayObject.getMonth() == local_cal.get(Calendar.MONTH))) {
//These dates come out of 30 days(Based on current date)
// disable_frame.setVisibility(View.VISIBLE);
} else {
//Rest days come here
// disable_frame.setVisibility(View.GONE);
dayObject.setDisable_date(true);
// event.setVisibility(View.GONE);
tv_date.setTextColor(Color.WHITE);
//Now compare the schedule date list with each date for matches
for (int i = 0; i < CustomGridCalendarView.schedule_list.size(); i++) {
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date scheduleDate = format.parse(CustomGridCalendarView.schedule_list.get(i).getScheduleDate());
cal = Calendar.getInstance();
cal.setTime(scheduleDate);
if (dayObject.getDay() == cal.get(Calendar.DAY_OF_MONTH) &&
dayObject.getMonth() == cal.get(Calendar.MONTH) &&
dayObject.getYear() == cal.get(Calendar.YEAR)
) {
//Show the event frame, here we got a match date
// event.setVisibility(View.VISIBLE);
// today.setVisibility(View.GONE);
tv_date.setTextColor(context.getResources().getColor(R.color.colorPrimary));
}
} catch (ParseException e) {
e.printStackTrace();
}
}
if (dayObject.isEvent_status()) {
// event.setVisibility(View.GONE);
// selected_frame.setVisibility(View.VISIBLE);
// today.setVisibility(View.GONE);
tv_date.setTextColor(Color.WHITE);
} else {
// selected_frame.setVisibility(View.GONE);
tv_date.setTextColor(Color.WHITE);
}
//Check for current date
if (dayObject.getYear() == local_cal.get(Calendar.YEAR) && dayObject.getMonth() == local_cal.get(Calendar.MONTH)
&& dayObject.getDay() == local_cal.get(Calendar.DAY_OF_MONTH)) {
// today.setVisibility(View.VISIBLE);
// tv_date.setTextColor(Color.WHITE);
// event.setVisibility(View.GONE);
// tv_date.setTypeface(Typeface.DEFAULT_BOLD);
} else {
// today.setVisibility(View.GONE);
}
}
}
return v;
}
public void refreshDays() {
boolean before_current_date = true;
// clear items
dayList.clear();
int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH) + 7;
int firstDay = (int) cal.get(Calendar.DAY_OF_WEEK);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
//TimeZone tz = TimeZone.getDefault();
// figure size of the array
if (firstDay == 0) {
days = new String[lastDay + (FIRST_DAY_OF_WEEK * 6)];
} else {
days = new String[lastDay + firstDay - (FIRST_DAY_OF_WEEK + 1)];
}
int j = FIRST_DAY_OF_WEEK;
// populate empty days before first real day
if (firstDay > 0) {
for (j = 0; j < (firstDay - FIRST_DAY_OF_WEEK) + 7; j++) {
days[j] = "";
Day d = new Day(0, 0, 0, false);
dayList.add(d);
}
} else {
for (j = 0; j < (FIRST_DAY_OF_WEEK * 6) + 7; j++) {
days[j] = "";
Day d = new Day(0, 0, 0, false);
dayList.add(d);
}
j = FIRST_DAY_OF_WEEK * 6 + 1; // sunday => 1, monday => 7
}
// populate days
int dayNumber = 1;
if (j > 0 && dayList.size() > 0 && j != 1) {
dayList.remove(j - 1);
}
for (int x = 0, i = j - 1; i < days.length; i++) {
Day day;
if (event_status.size() > x) {
day = new Day(dayNumber, year, month, event_status.get(x));
} else {
day = new Day(dayNumber, year, month, false);
}
x++;
Calendar cTemp = Calendar.getInstance();
cTemp.set(year, month, dayNumber);
//int startDay = Time.getJulianDay(cTemp.getTimeInMillis(), TimeUnit.MILLISECONDS.toSeconds(tz.getOffset(cTemp.getTimeInMillis())));
days[i] = "" + dayNumber;
dayNumber++;
dayList.add(day);
}
}
}