热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android学习教程之日历库使用(15)

这篇文章主要为大家详细介绍了Android学习教程之日历库使用的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本教程为大家分享了Android日历库的使用方法,供大家参考,具体内容如下

MainActivity.java代码:

package siso.weekv;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  findViewById(R.id.buttonBasic).setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    Intent intent = new Intent(MainActivity.this, BasicActivity.class);
    startActivity(intent);
   }
  });

  findViewById(R.id.buttonAsynchronous).setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    Intent intent = new Intent(MainActivity.this, AsynchronousActivity.class);
    startActivity(intent);
   }
  });
 }

}

AsynchronousActivity.java代码:

package siso.weekv;

import android.widget.Toast;


import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import retrofit.Callback;
import retrofit.RestAdapter;
import retrofit.RetrofitError;
import retrofit.client.Response;
import siso.weekv.apiclient.Event;
import siso.weekv.apiclient.MyJsonService;
import siso.wvlib.WeekViewEvent;


/**
 * An example of how events can be fetched from network and be displayed on the week view.
 * Created by Raquib-ul-Alam Kanak on 1/3/2014.
 * Website: http://alamkanak.github.io
 */
public class AsynchronousActivity extends BaseActivity implements Callback> {

 private List events = new ArrayList();
 boolean calledNetwork = false;

 @Override
 public List<&#63; extends WeekViewEvent> onMonthChange(int newYear, int newMonth) {

  // Download events from network if it hasn't been done already. To understand how events are
  // downloaded using retrofit, visit http://square.github.io/retrofit
  if (!calledNetwork) {
   RestAdapter retrofit = new RestAdapter.Builder()
     .setEndpoint("https://api.myjson.com/bins")
     .build();
   MyJsonService service = retrofit.create(MyJsonService.class);
   service.listEvents(this);
   calledNetwork = true;
  }

  // Return only the events that matches newYear and newMonth.
  List matchedEvents = new ArrayList();
  for (WeekViewEvent event : events) {
   if (eventMatches(event, newYear, newMonth)) {
    matchedEvents.add(event);
   }
  }
  return matchedEvents;
 }

 /**
  * Checks if an event falls into a specific year and month.
  * @param event The event to check for.
  * @param year The year.
  * @param month The month.
  * @return True if the event matches the year and month.
  */
 private boolean eventMatches(WeekViewEvent event, int year, int month) {
  return (event.getStartTime().get(Calendar.YEAR) == year && event.getStartTime().get(Calendar.MONTH) == month - 1) || (event.getEndTime().get(Calendar.YEAR) == year && event.getEndTime().get(Calendar.MONTH) == month - 1);
 }

 @Override
 public void success(List events, Response response) {
  this.events.clear();
  for (Event event : events) {
   this.events.add(event.toWeekViewEvent());
  }
  getWeekView().notifyDatasetChanged();
 }

 @Override
 public void failure(RetrofitError error) {
  error.printStackTrace();
  Toast.makeText(this, R.string.async_error, Toast.LENGTH_SHORT).show();
 }
}

BaseActivity.java

package siso.weekv;

import android.graphics.RectF;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

import siso.wvlib.DateTimeInterpreter;
import siso.wvlib.MonthLoader;
import siso.wvlib.WeekView;
import siso.wvlib.WeekViewEvent;

public abstract class BaseActivity extends AppCompatActivity implements WeekView.EventClickListener, MonthLoader.MonthChangeListener, WeekView.EventLongPressListener, WeekView.EmptyViewLongPressListener {
 private static final int TYPE_DAY_VIEW = 1;
 private static final int TYPE_THREE_DAY_VIEW = 2;
 private static final int TYPE_WEEK_VIEW = 3;
 private int mWeekViewType = TYPE_THREE_DAY_VIEW;
 private WeekView mWeekView;


 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_base);

  // Get a reference for the week view in the layout.
  mWeekView = (WeekView) findViewById(R.id.weekView);

  // Show a toast message about the touched event.
  mWeekView.setOnEventClickListener(this);


  mWeekView.setMonthChangeListener(this);

  // Set long press listener for events.
  mWeekView.setEventLongPressListener(this);


  mWeekView.setEmptyViewLongPressListener(this);


  setupDateTimeInterpreter(false);
 }


 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  int id = item.getItemId();
  setupDateTimeInterpreter(id == R.id.action_week_view);
  switch (id){
   case R.id.action_today:
    mWeekView.goToToday();
    return true;
   case R.id.action_day_view:
    if (mWeekViewType != TYPE_DAY_VIEW) {
     item.setChecked(!item.isChecked());
     mWeekViewType = TYPE_DAY_VIEW;
     mWeekView.setNumberOfVisibleDays(1);

     // Lets change some dimensions to best fit the view.
     mWeekView.setColumnGap((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics()));
     mWeekView.setTextSize((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 12, getResources().getDisplayMetrics()));
     mWeekView.setEventTextSize((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 12, getResources().getDisplayMetrics()));
    }
    return true;
   case R.id.action_three_day_view:
    if (mWeekViewType != TYPE_THREE_DAY_VIEW) {
     item.setChecked(!item.isChecked());
     mWeekViewType = TYPE_THREE_DAY_VIEW;
     mWeekView.setNumberOfVisibleDays(3);

     // Lets change some dimensions to best fit the view.
     mWeekView.setColumnGap((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics()));
     mWeekView.setTextSize((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 12, getResources().getDisplayMetrics()));
     mWeekView.setEventTextSize((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 12, getResources().getDisplayMetrics()));
    }
    return true;
   case R.id.action_week_view:
    if (mWeekViewType != TYPE_WEEK_VIEW) {
     item.setChecked(!item.isChecked());
     mWeekViewType = TYPE_WEEK_VIEW;
     mWeekView.setNumberOfVisibleDays(7);


     mWeekView.setColumnGap((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, getResources().getDisplayMetrics()));
     mWeekView.setTextSize((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 10, getResources().getDisplayMetrics()));
     mWeekView.setEventTextSize((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 10, getResources().getDisplayMetrics()));
    }
    return true;
  }

  return super.onOptionsItemSelected(item);
 }


 private void setupDateTimeInterpreter(final boolean shortDate) {
  mWeekView.setDateTimeInterpreter(new DateTimeInterpreter() {
   @Override
   public String interpretDate(Calendar date) {
    SimpleDateFormat weekdayNameFormat = new SimpleDateFormat("EEE", Locale.getDefault());
    String weekday = weekdayNameFormat.format(date.getTime());
    SimpleDateFormat format = new SimpleDateFormat(" M/d", Locale.getDefault());


    if (shortDate)
     weekday = String.valueOf(weekday.charAt(0));
    return weekday.toUpperCase() + format.format(date.getTime());
   }

   @Override
   public String interpretTime(int hour) {
    return hour > 11 &#63; (hour - 12) + " PM" : (hour == 0 &#63; "12 AM" : hour + " AM");
   }
  });
 }

 protected String getEventTitle(Calendar time) {
  return String.format("事件 %02d:%02d %s/%d", time.get(Calendar.HOUR_OF_DAY), time.get(Calendar.MINUTE), time.get(Calendar.MONTH)+1, time.get(Calendar.DAY_OF_MONTH));
 }

 @Override
 public void onEventClick(WeekViewEvent event, RectF eventRect) {
  Toast.makeText(this, "点击 " + event.getName(), Toast.LENGTH_SHORT).show();
 }

 @Override
 public void onEventLongPress(WeekViewEvent event, RectF eventRect) {
  Toast.makeText(this, "长按事件: " + event.getName(), Toast.LENGTH_SHORT).show();
 }

 @Override
 public void onEmptyViewLongPress(Calendar time) {
  Toast.makeText(this, "空视图长按: " + getEventTitle(time), Toast.LENGTH_SHORT).show();
 }

 public WeekView getWeekView() {
  return mWeekView;
 }
}

BasicActivity.java

package siso.weekv;


import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import siso.wvlib.WeekViewEvent;


public class BasicActivity extends BaseActivity {

 @Override
 public List<&#63; extends WeekViewEvent> onMonthChange(int newYear, int newMonth) {
  // Populate the week view with some events.
  List events = new ArrayList();

  Calendar startTime = Calendar.getInstance();
  startTime.set(Calendar.HOUR_OF_DAY, 3);
  startTime.set(Calendar.MINUTE, 0);
  startTime.set(Calendar.MONTH, newMonth-1);
  startTime.set(Calendar.YEAR, newYear);
  Calendar endTime = (Calendar) startTime.clone();
  endTime.add(Calendar.HOUR, 1);
  endTime.set(Calendar.MONTH, newMonth-1);
  WeekViewEvent event = new WeekViewEvent(1, getEventTitle(startTime), startTime, endTime);
  event.setColor(getResources().getColor(R.color.event_color_01));
  events.add(event);

  startTime = Calendar.getInstance();
  startTime.set(Calendar.HOUR_OF_DAY, 3);
  startTime.set(Calendar.MINUTE, 30);
  startTime.set(Calendar.MONTH, newMonth-1);
  startTime.set(Calendar.YEAR, newYear);
  endTime = (Calendar) startTime.clone();
  endTime.set(Calendar.HOUR_OF_DAY, 4);
  endTime.set(Calendar.MINUTE, 30);
  endTime.set(Calendar.MONTH, newMonth-1);
  event = new WeekViewEvent(10, getEventTitle(startTime), startTime, endTime);
  event.setColor(getResources().getColor(R.color.event_color_02));
  events.add(event);

  startTime = Calendar.getInstance();
  startTime.set(Calendar.HOUR_OF_DAY, 4);
  startTime.set(Calendar.MINUTE, 20);
  startTime.set(Calendar.MONTH, newMonth-1);
  startTime.set(Calendar.YEAR, newYear);
  endTime = (Calendar) startTime.clone();
  endTime.set(Calendar.HOUR_OF_DAY, 5);
  endTime.set(Calendar.MINUTE, 0);
  event = new WeekViewEvent(10, getEventTitle(startTime), startTime, endTime);
  event.setColor(getResources().getColor(R.color.event_color_03));
  events.add(event);

  startTime = Calendar.getInstance();
  startTime.set(Calendar.HOUR_OF_DAY, 5);
  startTime.set(Calendar.MINUTE, 30);
  startTime.set(Calendar.MONTH, newMonth-1);
  startTime.set(Calendar.YEAR, newYear);
  endTime = (Calendar) startTime.clone();
  endTime.add(Calendar.HOUR_OF_DAY, 2);
  endTime.set(Calendar.MONTH, newMonth-1);
  event = new WeekViewEvent(2, getEventTitle(startTime), startTime, endTime);
  event.setColor(getResources().getColor(R.color.event_color_02));
  events.add(event);

  startTime = Calendar.getInstance();
  startTime.set(Calendar.HOUR_OF_DAY, 5);
  startTime.set(Calendar.MINUTE, 0);
  startTime.set(Calendar.MONTH, newMonth-1);
  startTime.set(Calendar.YEAR, newYear);
  startTime.add(Calendar.DATE, 1);
  endTime = (Calendar) startTime.clone();
  endTime.add(Calendar.HOUR_OF_DAY, 3);
  endTime.set(Calendar.MONTH, newMonth - 1);
  event = new WeekViewEvent(3, getEventTitle(startTime), startTime, endTime);
  event.setColor(getResources().getColor(R.color.event_color_03));
  events.add(event);

  startTime = Calendar.getInstance();
  startTime.set(Calendar.DAY_OF_MONTH, 15);
  startTime.set(Calendar.HOUR_OF_DAY, 3);
  startTime.set(Calendar.MINUTE, 0);
  startTime.set(Calendar.MONTH, newMonth-1);
  startTime.set(Calendar.YEAR, newYear);
  endTime = (Calendar) startTime.clone();
  endTime.add(Calendar.HOUR_OF_DAY, 3);
  event = new WeekViewEvent(4, getEventTitle(startTime), startTime, endTime);
  event.setColor(getResources().getColor(R.color.event_color_04));
  events.add(event);

  startTime = Calendar.getInstance();
  startTime.set(Calendar.DAY_OF_MONTH, 1);
  startTime.set(Calendar.HOUR_OF_DAY, 3);
  startTime.set(Calendar.MINUTE, 0);
  startTime.set(Calendar.MONTH, newMonth-1);
  startTime.set(Calendar.YEAR, newYear);
  endTime = (Calendar) startTime.clone();
  endTime.add(Calendar.HOUR_OF_DAY, 3);
  event = new WeekViewEvent(5, getEventTitle(startTime), startTime, endTime);
  event.setColor(getResources().getColor(R.color.event_color_01));
  events.add(event);

  startTime = Calendar.getInstance();
  startTime.set(Calendar.DAY_OF_MONTH, startTime.getActualMaximum(Calendar.DAY_OF_MONTH));
  startTime.set(Calendar.HOUR_OF_DAY, 15);
  startTime.set(Calendar.MINUTE, 0);
  startTime.set(Calendar.MONTH, newMonth-1);
  startTime.set(Calendar.YEAR, newYear);
  endTime = (Calendar) startTime.clone();
  endTime.add(Calendar.HOUR_OF_DAY, 3);
  event = new WeekViewEvent(5, getEventTitle(startTime), startTime, endTime);
  event.setColor(getResources().getColor(R.color.event_color_02));
  events.add(event);

  return events;
 }

}

apiclient文件夹下Event.java和MyJsonService.java

package siso.weekv.apiclient;

import android.annotation.SuppressLint;
import android.graphics.Color;


import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import siso.wvlib.WeekViewEvent;


public class Event {

 @Expose @SerializedName("name")
 private String mName;
 @Expose @SerializedName("dayOfMonth")
 private int mDayOfMonth;
 @Expose @SerializedName("startTime")
 private String mStartTime;
 @Expose @SerializedName("endTime")
 private String mEndTime;
 @Expose @SerializedName("color")
 private String mColor;

 public String getName() {
  return mName;
 }

 public void setName(String name) {
  this.mName = name;
 }

 public int getDayOfMonth() {
  return mDayOfMonth;
 }

 public void setDayOfMonth(int dayOfMonth) {
  this.mDayOfMOnth= dayOfMonth;
 }

 public String getStartTime() {
  return mStartTime;
 }

 public void setStartTime(String startTime) {
  this.mStartTime = startTime;
 }

 public String getEndTime() {
  return mEndTime;
 }

 public void setEndTime(String endTime) {
  this.mEndTime = endTime;
 }

 public String getColor() {
  return mColor;
 }

 public void setColor(String color) {
  this.mColor = color;
 }

 @SuppressLint("SimpleDateFormat")
 public WeekViewEvent toWeekViewEvent(){

  // Parse time.
  SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
  Date start = new Date();
  Date end = new Date();
  try {
   start = sdf.parse(getStartTime());
  } catch (ParseException e) {
   e.printStackTrace();
  }
  try {
   end = sdf.parse(getEndTime());
  } catch (ParseException e) {
   e.printStackTrace();
  }

  // Initialize start and end time.
  Calendar now = Calendar.getInstance();
  Calendar startTime = (Calendar) now.clone();
  startTime.setTimeInMillis(start.getTime());
  startTime.set(Calendar.YEAR, now.get(Calendar.YEAR));
  startTime.set(Calendar.MONTH, now.get(Calendar.MONTH));
  startTime.set(Calendar.DAY_OF_MONTH, getDayOfMonth());
  Calendar endTime = (Calendar) startTime.clone();
  endTime.setTimeInMillis(end.getTime());
  endTime.set(Calendar.YEAR, startTime.get(Calendar.YEAR));
  endTime.set(Calendar.MONTH, startTime.get(Calendar.MONTH));
  endTime.set(Calendar.DAY_OF_MONTH, startTime.get(Calendar.DAY_OF_MONTH));

  // Create an week view event.
  WeekViewEvent weekViewEvent = new WeekViewEvent();
  weekViewEvent.setName(getName());
  weekViewEvent.setStartTime(startTime);
  weekViewEvent.setEndTime(endTime);
  weekViewEvent.setColor(Color.parseColor(getColor()));

  return weekViewEvent;
 }
}

package siso.weekv.apiclient;

import java.util.List;

import retrofit.Callback;
import retrofit.http.GET;

/**
 * Created by Raquib-ul-Alam Kanak on 1/3/16.
 * Website: http://alamkanak.github.io
 */
public interface MyJsonService {

 //https://api.myjson.com/bins/3nh0k
 @GET("/3nh0k")
 void listEvents(Callback> eventsCallback);

}

app项目结构:

这里写图片描述

Andriod类库项目结构:

这里写图片描述

项目运行结果如图:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

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


推荐阅读
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 学习笔记(34):第三阶段4.2.6:SpringCloud Config配置中心的应用与原理第三阶段4.2.6SpringCloud Config配置中心的应用与原理
    立即学习:https:edu.csdn.netcourseplay29983432482?utm_sourceblogtoedu配置中心得核心逻辑springcloudconfi ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
author-avatar
就是!有梦想
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有