Android实现带签到赢积分功能的日历

Android实现点击签到按钮直接签到,弹出dialog,先上效果图

demo是利用gridview实现的,现附上布局文件

<?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="match_parent"
  android:orientation="vertical"
 >
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:padding="2dp"
 android:orientation="vertical"
 android:background="@drawable/shape_btn_white"
 >
 <RelativeLayout
 android:layout_width="match_parent"
 android:layout_height="40dp"
 >
 <ImageView
  android:id="@+id/iv_front"
  android:layout_width="30dp"
  android:layout_height="40dp"
  android:padding="10dp"
  android:layout_marginLeft="8dp"
  android:scaleType="centerCrop"
  android:layout_alignParentLeft="true"
  android:layout_centerInParent="true"
  android:src="@mipmap/icon_sign_front"
  />
 <TextView
  android:id="@+id/tv_date"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerInParent="true"
  android:textColor="#2fbbef"
  android:textSize="15sp"
  android:text="2016-7-16"
  />
 <ImageView
  android:id="@+id/iv_next"
  android:layout_width="30dp"
  android:layout_height="40dp"
  android:layout_marginRight="8dp"
  android:padding="10dp"
  android:scaleType="centerCrop"
  android:layout_alignParentRight="true"
  android:layout_centerInParent="true"
  android:src="@mipmap/icon_sign_next"
  />
 </RelativeLayout>
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="40dp"
 >
 <TextView
  android:layout_width="40dp"
  android:layout_height="40dp"
  android:layout_weight="1"
  android:gravity="center"
  android:text="日"
  android:textSize="15sp"
  android:textColor="#888"
  />
 <TextView
  android:layout_width="40dp"
  android:layout_height="40dp"
  android:layout_weight="1"
  android:gravity="center"
  android:text="一"
  android:textSize="15sp"
  android:textColor="#888"
  />
 <TextView
  android:layout_width="40dp"
  android:layout_height="40dp"
  android:layout_weight="1"
  android:gravity="center"
  android:text="二"
  android:textSize="15sp"
  android:textColor="#888"
  />
 <TextView
  android:layout_width="40dp"
  android:layout_height="40dp"
  android:layout_weight="1"
  android:gravity="center"
  android:text="三"
  android:textSize="15sp"
  android:textColor="#888"
  />
 <TextView
  android:layout_width="40dp"
  android:layout_height="40dp"
  android:layout_weight="1"
  android:gravity="center"
  android:text="四"
  android:textSize="15sp"
  android:textColor="#888"
  />
 <TextView
  android:layout_width="40dp"
  android:layout_height="40dp"
  android:layout_weight="1"
  android:gravity="center"
  android:text="五"
  android:textSize="15sp"
  android:textColor="#888"
  />
 <TextView
  android:layout_width="40dp"
  android:layout_height="40dp"
  android:layout_weight="1"
  android:gravity="center"
  android:text="六"
  android:textSize="15sp"
  android:textColor="#888"
  />
 </LinearLayout>
 <GridView
 android:id="@+id/gv_sign_date"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:background="#dbdbdb"
 android:clickable="true"
 android:clipChildren="true"
 android:columnWidth="30dp"
 android:listSelector="@null"
 android:numColumns="7"
 android:paddingBottom="1dp"
 android:stretchMode="columnWidth"
 android:verticalSpacing="1dp"
 ></GridView>
 <TextView
  android:layout_width="match_parent"
  android:layout_height="1dp"
  android:background="#dbdbdb"
  />
 <LinearLayout
  android:layout_width="match_parent"
  android:layout_height="50dp"
  android:gravity="center"
  >
  <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="连续签到会有更多积分哦 !"
  android:textColor="#2a2a2a"
  android:layout_marginRight="5dp"
  android:textSize="14sp"
  />
  <TextView
  android:id="@+id/tv_sign_num"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginRight="20dp"
  android:visibility="gone"
  android:text="3天"
  />
  <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="@string/jifen"
  android:textColor="#2a2a2a"
  android:visibility="gone" 

  android:layout_marginRight="5dp"
  android:textSize="14sp"
  />
  <TextView
  android:id="@+id/tv_jifen_num"
  android:visibility="gone"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="100"
  />
 </LinearLayout>
</LinearLayout>
</LinearLayout>

效果图:

dialog中的主要代码:

public class SignDataDialog extends Dialog implements View.OnClickListener{
 private GridView gridView;
 private ImageView iv_front,iv_next;
 private TextView tv_date,tv_sign_days,tv_jifen;
 private MyCalendarAdapter adapter;
 private SpecialCalendar sp;
 private Context context;
 private SignDateModle modle;
 private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
 private String systime;
 private int year,month;
 String[] b=new String[]{
  "0","0","0","0","0","0","0",
  "0","0","0","0","0","0","0",
  "0","0","0","0","0","0","0",
  "0","0","0","0","0","0","0",
  "0","0","0","0","0","0","0",
  "0","0","0","0","0","0","0"
 };
 public SignDataDialog(Context context,SignDateModle modle) {
 super(context);
 this.context=context;
 this.modle=modle;
 setContentView(R.layout.dialog_sign_data);
 Window window = getWindow();
 WindowManager.LayoutParams params = window.getAttributes();
 params.gravity = Gravity.CENTER;
 window.setBackgroundDrawableResource(android.R.color.transparent);
 window.setAttributes(params);
 setCanceledOnTouchOutside(true);
 } 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 sp=new SpecialCalendar();
 Date date = new Date();
 systime = sdf.format(date);
 year=Integer.valueOf(systime.split("-")[0]);
 month=Integer.valueOf(systime.split("-")[1]);
 iv_front= (ImageView) findViewById(R.id.iv_front);
 iv_next= (ImageView) findViewById(R.id.iv_next);
 gridView= (GridView) findViewById(R.id.gv_sign_date);
 tv_date= (TextView) findViewById(R.id.tv_date);
 tv_sign_days= (TextView) findViewById(R.id.tv_sign_num);
 tv_jifen= (TextView) findViewById(R.id.tv_jifen_num);
 tv_date.setText(systime);
 iv_front.setOnClickListener(this);
 iv_next.setOnClickListener(this);
 if (modle!=null) {
  String dates=modle.getDateTime();
  adapter = new MyCalendarAdapter(context, Integer.valueOf(dates.split("-")[0]), Integer.valueOf(dates.split("-")[1]), 17, getStrings(modle));
  gridView.setAdapter(adapter);
 }
 }
public String[] getStrings(SignDateModle modle){
 int year=Integer.valueOf(modle.getDateTime().split("-")[0]);
 int moth=Integer.valueOf(modle.getDateTime().split("-")[1]);
 int start=sp.getWeekdayOfMonth(year,moth);
 for (int i=0;i<modle.getDatas().size();i++){
 if (modle.getDatas().get(i).getStatus()==1){
  b[i]=String.valueOf(1);
 }
 }
 return b;
}
 @Override
 public void onClick(View v) {
 switch (v.getId()){
  case R.id.iv_front:
  redMonth();
  tv_date.setText(year+"-"+month+"-"+systime.split("-")[2]);
  changeOtherMoth(year, month);
  break;
  case R.id.iv_next:
  addMonth();
  tv_date.setText(year+"-"+month+"-"+systime.split("-")[2]);
  changeOtherMoth(year,month);
  break;
 }
 }
 public void addMonth(){
 month++;
 if (month==13){
  month=1;
  year++;
 }
 }
 public void redMonth(){
 month--;
 if (month==0){
  month=12;
  year--;
 }
 }
 public void changeOtherMoth(int year,int moth){
 if (CMethod.isNet(context)){
  JSONObject jsonObject= NetJsonModle.getJsonObject(context,"528");
  try {
  jsonObject.put("reporterId",new LastLoginUtils(context).getReporterId());
  jsonObject.put("time", year + "-" + moth);
  HttpUtils.PostDataToWeb(UrlAddressUrils.CODE_OTHER, AppConstants.SIGN_DATA_INFO, jsonObject, new HttpClientListener() {
   @Override
   public void onSuccess(String result) {
   Gson gson = new Gson();
   SignDateModle m = gson.fromJson(result, SignDateModle.class);
   for (int i = 0; i < b.length; i++) {
    b[i] = "0";
   }
   if (m != null) {
    String dates = m.getDateTime();
    adapter = new MyCalendarAdapter(context, Integer.valueOf(dates.split("-")[0]), Integer.valueOf(dates.split("-")[1]), 17, getStrings(m));
    gridView.setAdapter(adapter);
   }
   } 

   @Override
   public void onFailure(String result) { 

   } 

   @Override
   public void onError() { 

   }
  });
  } catch (JSONException e) {
  e.printStackTrace();
  }
 }else {
  T.s("请检查网络是否连接");
 }
 }

其计算日期的主要代码在适配器中:

 class MyCalendarAdapter extends BaseAdapter{
 private boolean isLeapyear = false; // 是否为闰年
 private int daysOfMonth = 0; // 某月的天数
 private int dayOfWeek = 0; // 具体某一天是星期几
 private int lastDaysOfMonth = 0; // 上一个月的总天数
 private Context context;
 private String[] dayNumber = new String[42]; // 一个gridview中的日期存入此数组中
 private SpecialCalendar sc = null;
 private String currentYear = "";
 private String currentMonth = "";
 private int currentFlag = -1; // 用于标记当天
 private String showYear = ""; // 用于在头部显示的年份
 private String showMonth = ""; // 用于在头部显示的月份
 private String animalsYear = "";
 private String leapMonth = ""; // 闰哪一个月
 // 系统当前时间
 private String sysDate = "";
 private String sys_year = "";
 private String sys_month = "";
 private String sys_day = "";
 private boolean flag;// 标记是不是本月
 private String[] data;
 private int a;
 public MyCalendarAdapter() {
  Date date = new Date();
  sysDate = sdf.format(date); // 当期日期
  sys_year = sysDate.split("-")[0];
  sys_month = sysDate.split("-")[1];
  sys_day = sysDate.split("-")[2]; 

 }
 public MyCalendarAdapter(Context context,int year_c,int month_c, int day_c, String[] a) {
  // TODO Auto-generated constructor stub
  this();
  this.context = context;
  sc = new SpecialCalendar();
  currentYear = String.valueOf(year_c);// 得到当前的年份
  currentMonth = String.valueOf(month_c);
  getCalendar(Integer.parseInt(currentYear),
   Integer.parseInt(currentMonth));
  data = a;
 }
 @Override
 public int getCount() {
  return dayNumber.length;
 } 

 @Override
 public Object getItem(int position) {
  return position;
 } 

 @Override
 public long getItemId(int position) {
  return position;
 } 

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  ViewHolder holder;
  if (convertView==null){
  holder=new ViewHolder();
  convertView= LayoutInflater.from(context).inflate(R.layout.item_sign_data,null);
  holder.iv_bg= (ImageView) convertView.findViewById(R.id.iv_bg);
  holder.tv_date= (TextView) convertView.findViewById(R.id.tv_date);
  convertView.setTag(holder);
  }else {
  holder= (ViewHolder) convertView.getTag();
  }
  String d = dayNumber[position];
  holder.tv_date.setText(d);
  holder.tv_date.setTextColor(Color.GRAY); 

  if (position < daysOfMonth + dayOfWeek && position >= dayOfWeek) {
  // 当前月信息显示
  holder.tv_date.setTextColor(Color.parseColor("#2a2a2a"));// 当月字体设黑
  flag = true;
  a++;
  } else {
  flag = false;
  }
  if (flag) {
  if (a <= data.length) {
   String att = data[a - 1];
   if (att.equals("1")) {//签到
    holder.tv_date.setTextColor(Color.parseColor("#2a2a2a"));
    holder.iv_bg.setVisibility(View.VISIBLE);
   }
  }
  }
  if (currentFlag == position) {
  // 设置当天的背景
//  String dv="今日";
//  SpannableString sp = new SpannableString(d + "\n" + dv);//当天字体加粗
//  sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0,
//   d.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//  sp.setSpan(new RelativeSizeSpan(1.2f), 0, d.length(),
//   Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//  sp.setSpan(new RelativeSizeSpan(0.75f), d.length() ,
//   dayNumber[position].length()+ 3,
//   Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//  holder.tv_date.setText(sp);
//  holder.iv_bg.setVisibility(View.VISIBLE);
  holder.iv_bg.setImageDrawable(context.getResources().getDrawable(R.mipmap.icon_sign_bg_today));
  }
  return convertView;
 }
 class ViewHolder{
  private ImageView iv_bg;
  private TextView tv_date;
 }
 // 得到某年的某月的天数且这月的第一天是星期几
 public void getCalendar(int year, int month) {
  isLeapyear = sc.isLeapYear(year); // 是否为闰年
  daysOfMonth = sc.getDaysOfMonth(isLeapyear, month); // 某月的总天数
  dayOfWeek = sc.getWeekdayOfMonth(year, month); // 某月第一天为星期几
  lastDaysOfMonth = sc.getDaysOfMonth(isLeapyear, month - 1); // 上一个月的总天数
  getweek(year, month);
 }
 // 将一个月中的每一天的值添加入数组dayNuber中
 private void getweek(int year, int month) {
  int j = 1;
  int flag = 0;
  String lunarDay = ""; 

  // 得到当前月的所有日程日期(这些日期需要标记)
  for (int i = 0; i < dayNumber.length; i++) { 

  if (i < dayOfWeek) { // 前一个月
   int temp = lastDaysOfMonth - dayOfWeek + 1;
   dayNumber[i] = (temp + i) + "";
  } else if (i < daysOfMonth + dayOfWeek) { // 本月
   String day = String.valueOf(i - dayOfWeek + 1); // 得到的日期
   dayNumber[i] = i - dayOfWeek + 1 + "";
   // 对于当前月才去标记当前日期
   if (sys_year.equals(String.valueOf(year))
    && sys_month.equals(String.valueOf(month))
    && sys_day.equals(day)) {
   // 标记当前日期
   currentFlag = i;
   }
   setShowYear(String.valueOf(year));
   setShowMonth(String.valueOf(month));
  } else { // 下一个月
   dayNumber[i] = j + "";
   j++;
  }
  }
  String abc = "";
  for (int i = 0; i < dayNumber.length; i++) {
  abc = abc + dayNumber[i] + ":";
  }
 } 

 public String getShowYear() {
  return showYear;
 } 

 public void setShowYear(String showYear) {
  this.showYear = showYear;
 } 

 public String getShowMonth() {
  return showMonth;
 } 

 public void setShowMonth(String showMonth) {
  this.showMonth = showMonth;
 } 

 public String getAnimalsYear() {
  return animalsYear;
 } 

 public void setAnimalsYear(String animalsYear) {
  this.animalsYear = animalsYear;
 } 

 public String getLeapMonth() {
  return leapMonth;
 } 

 public void setLeapMonth(String leapMonth) {
  this.leapMonth = leapMonth;
 }
} 
public class SpecialCalendar { 

 private int daysOfMonth = 0; // 某月的天数
 private int dayOfWeek = 0; // 具体某一天是星期几 

 // 判断是否为闰年
 public boolean isLeapYear(int year) {
 if (year % 100 == 0 && year % 400 == 0) {
  return true;
 } else if (year % 100 != 0 && year % 4 == 0) {
  return true;
 }
 return false;
 } 

 // 得到某月有多少天数
 public int getDaysOfMonth(boolean isLeapyear, int month) {
 switch (month) {
 case 1:
 case 3:
 case 5:
 case 7:
 case 8:
 case 10:
 case 12:
  daysOfMonth = 31;
  break;
 case 4:
 case 6:
 case 9:
 case 11:
  daysOfMonth = 30;
  break;
 case 2:
  if (isLeapyear) {
  daysOfMonth = 29;
  } else {
  daysOfMonth = 28;
  } 

 }
 return daysOfMonth;
 } 

 // 指定某年中的某月的第一天是星期几
 public int getWeekdayOfMonth(int year, int month) {
 Calendar cal = Calendar.getInstance();
 cal.set(year, month - 1, 1);
 dayOfWeek = cal.get(Calendar.DAY_OF_WEEK) - 1;
 return dayOfWeek;
 } 

} 

积分当然是交给后台处理返回了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android积分签到上移消失动画效果

    还记得以前在某云的时候,有次需求是一个积分签到,要求点击签到按钮然后有一个动画效果,比如+30积分然后慢慢往上移动在消失.那会不会做就想着改下需求,直接去掉了动画效果,而今时隔很久又遇到同样的问题,比较蛋疼的是我清楚记得当时做过这个功能,但是自己没有做出来,当然现在做还是不会.自己当年省写的代码含泪也要补上.这次吸取教训,实现这个效果. 大致思路:动画部分,由一个垂直的平移和一个透明度变化的两个动画组成.然后通过AnimationSet将两个动画添加到集合,然后开始播放动画. 更新UI部分,用的

  • Android自定义按周签到打卡功能实例代码

    前言 之前实现过<Android可签到的日历控件>的功能,跟这篇一样都是实现签到打卡功能,这篇实现的是按月进行打卡做标识,本篇内容实现的按周进行签到打卡. 实现签到规则如下: 1.连续签到7天,即可获得额外积分奖励. 2.连续签到记录在第8天开始时将清零重新计算. 3.如果中断签到,连续签到记录也将清零. 实现步骤: 1.效果图 2.自定义签到打卡View 3.主程序逻辑处理 4.主界面 5.签到bean 6.总结 实现过程: 1.效果图 2.自定义签到打卡View /** * descrip

  • Android简单实现app每月签到功能

    本文实例为大家分享了Android实现app每月签到功能的具体代码,供大家参考,具体内容如下 先上一张效果图: 其中这些签到的效果图是在网上找的,然后重要用到的控件就是 GridvVew 了, 代码很简单,只有3个代码文件: MainActivity.class 文件 package zhanghuan.cn.checkdesign; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import

  • Android基于AccessibilityService制作的钉钉自动签到程序代码

    前两天公司开始宣布要使用阿里钉钉来签到啦!!!~~这就意味着,我必须老老实实每天按时签到上班下班了,这真是一个悲伤的消息,可是!!!!那么机智(lan)的我,怎么可能就这么屈服!!!阿里钉钉签到,说到底不就是手机软件签到吗?我就是干移动开发的,做一个小应用每天自动签到不就行了:) 说干就干,首先分析一下,阿里钉钉的签到流程: 打开阿里钉钉->广告页停留2S左右->进入主页->点击"工作"tab->点击"签到"模块->进入签到页面(可能会

  • Android可签到日历控件的实现方法

    最近在公司的功能需求中,需要实现可以签到的日历,签到后在签到过的日期做标志.本功能参考了网上一些大神的日历控件,在此基础上进行修改,已满足本公司的需求,现已完成,记录一下. 布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_wi

  • Android实现带签到赢积分功能的日历

    Android实现点击签到按钮直接签到,弹出dialog,先上效果图 demo是利用gridview实现的,现附上布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent&qu

  • Python 实现「食行生鲜」签到领积分功能

    用过食行生鲜的同学应该知道,每天可以在食行生鲜签到,签到可以领到 20 积分,在购物时可以抵 2 毛钱.钱虽少,但是积少成多,买菜时可以抵扣一两块钱还是不错的. 今天我们就用 Python 来实现自动签到,省得我每天打开 APP 来操作了. 分析 要自动签到,最简单的是打开页面分析请求,然后我们用脚本实现请求的自动化.但是发现食行没有页面,只有 APP,这不是一个好消息,这意味着需要抓包处理了. 不过还好,我们有微信. 在微信里面,我们发现也可以登录食行,这时选择在浏览器中打开页面,~哎~ ,柳

  • Android自带API实现分享功能

    前言 在做项目的过程中需要实现文字和图片的分享,有两种方式: 1. 使用android sdk中自带的Intent.ACTION_SEND实现分享. 2. 使用shareSDK.友盟等第三方的服务. 鉴于使用的方便,此次只介绍使用Android sdk中自带的方式来实现分享的功能. 分享文字 /** * 分享文字内容 * * @param dlgTitle * 分享对话框标题 * @param subject * 主题 * @param content * 分享内容(文字) */ private

  • Python实现App自动签到领取积分功能

    要自动签到,最简单的是打开页面分析请求,然后我们用脚本实现请求的自动化.但是发现食行没有页面,只有 APP,这不是一个好消息,这意味着需要抓包处理了. 下面的操作就好办了,在电脑端的浏览器打开网址,按下 F12,开始起飞~ 登录分析 点击签到后,会跳转到用户登录页面: https://wechatx.34580.com/mart/#/sign/in,输入登录信息后,点击登录,同时关注开发调试栏的网络交互信息 . 可以发现,登录的请求地址是: https://wechatx.34580.com/s

  • Android 实现带字母索引的侧边栏功能

    之前已经用自定义View做出如下这样一个效果了 这两天需要重新拿来使用,发现效果虽然做出来了,不过思路不太对,就重新参考写了一个,用法也更为简单了 首要的自然是需要继承View绘制出侧边栏,并向外提供一个监听字母索引变化的方法 /** * 作者:叶应是叶 * 时间:2017/8/20 11:38 * 描述: */ public class LetterIndexView extends View { public interface OnTouchingLetterChangedListener

  • Android 百度地图定位实现仿钉钉签到打卡功能的完整代码

    导语 本章根据百度地图API,实现仿钉钉打卡功能.用到了基础地图.覆盖物.定位图层.陀螺仪方法.悬浮信息弹框. 百度地图API地址  :Android 地图SDK 请先注册注册百度账号和获取密钥,并实现地图显示出来.(注意:密钥.权限要设置) 另外,我得说明本章所下载官方Demo 和 导入的jar包和so文件.自定义下载即可,如下图: 接下来,一起看实现效果. 源码Git地址:BaiduMapApp 效果图 实现代码·三步骤 第一步:基础地图和方向传感器 类先实现方向传感器 implements

  • Android Studio实现带三角函数对数运算功能的高级计算器

    用AndroidStudio编写高级计算器带三角函数对数运算功能 界面效果图: layout布局 activity_jisuanqi.xml代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="

  • Android 上实现DragonBones换装功能

    目录 前言 技术选型 Korge的基本用法 实现换装的多种实现 静态换装 vs 动态换装 静态换装 动态换装 包含动画 vs 不包含动画 局部换装 vs 全局换装 全局换装之Skin修改 全局换装之纹理修改 总结 前言 最近在预研一款换装的小游戏,通过在积分乐园中兑换服装,就可以在不同场景中展示穿上新服装的角色.对于这类有主题形象的动画,自然就想到了骨骼动画,通过网格自由变形和蒙皮技术就能在视觉上呈现所需要的动画效果,并且骨骼动画也支持皮肤替换,或者插槽的图片替换,对于换装的需求比较友好.因此决

  • Android自定义实现图片加文字功能

    Android自定义实现图片加文字功能 分四步来写: 1,组合控件的xml; 2,自定义组合控件的属性; 3,自定义继承组合布局的class类,实现带两参数的构造器; 4,在xml中展示组合控件. 具体实现过程: 一.组合控件的xml 我接触的有两种方式,一种是普通的Activity的xml:一种是父节点为merge的xml.我项目中用的是第一种,但个人感觉第二种好,因为第一种多了相对或者绝对布局层. 我写的 custom_pictext.xml <?xml version="1.0&qu

随机推荐