因为日历是系统自带的,所以读写它一定要申请权限,也就是在AndroidManifest.xml加如下两行代码(一个读一个写):
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
Android中日历用了三个URL,分别是日历用户的URL,事件的URL,事件提醒URL,三个URL在Android2.1之前是如下的样子:
calanderURL = "content://calendar/calendars";
calanderEventURL = "content://calendar/events";
calanderRemiderURL= "content://calendar/reminders";
但是在Android2.2版本以后,三个URL有了改变,变成如下的样子:
calanderURL = "content://com.android.calendar/calendars";
calanderEventURL = "content://com.android.calendar/events";
calanderRemiderURL = "content://com.android.calendar/reminders";
简单的Demo,按照我的步骤一步一步的来:
第一步:新建一个Android工程命名为CalendarDemo.
第二步:修改main.xml布局文件,增加了三个按钮,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/readUserButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Get a User"
/>
<Button
android:id="@+id/readEventButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Get a Event"
/>
<Button
android:id="@+id/writeEventButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Input a Event"
/>
</LinearLayout>
第三步:修改主核心程序CalendarDemo.java,代码如下:
package com.tutor.calendardemo;
import java.util.Calendar;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class CalendarDemo extends Activity implements OnClickListener {
private Button mReadUserButton;
private Button mReadEventButton;
private Button mWriteEventButton;
private static String calanderURL = "";
private static String calanderEventURL = "";
private static String calanderRemiderURL = "";
//为了兼容不同版本的日历,2.2以后url发生改变
static{
if(Integer.parseInt(Build.VERSION.SDK) >= 8){
calanderURL = "content://com.android.calendar/calendars";
calanderEventURL = "content://com.android.calendar/events";
calanderRemiderURL = "content://com.android.calendar/reminders";
}else{
calanderURL = "content://calendar/calendars";
calanderEventURL = "content://calendar/events";
calanderRemiderURL = "content://calendar/reminders";
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupViews();
}
private void setupViews(){
mReadUserButton = (Button)findViewById(R.id.readUserButton);
mReadEventButton = (Button)findViewById(R.id.readEventButton);
mWriteEventButton = (Button)findViewById(R.id.writeEventButton);
mReadUserButton.setOnClickListener(this);
mReadEventButton.setOnClickListener(this);
mWriteEventButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v == mReadUserButton){
Cursor userCursor = getContentResolver().query(Uri.parse(calanderURL), null,
null, null, null);
if(userCursor.getCount() > 0){
userCursor.moveToFirst();
String userName = userCursor.getString(userCursor.getColumnIndex("name"));
Toast.makeText(CalendarDemo.this, userName, Toast.LENGTH_LONG).show();
}
}else if(v == mReadEventButton){
Cursor eventCursor = getContentResolver().query(Uri.parse(calanderEventURL), null,
null, null, null);
if(eventCursor.getCount() > 0){
eventCursor.moveToLast();
String eventTitle = eventCursor.getString(eventCursor.getColumnIndex("title"));
Toast.makeText(CalendarDemo.this, eventTitle, Toast.LENGTH_LONG).show();
}
}else if(v == mWriteEventButton){
//获取要出入的gmail账户的id
String calId = "";
Cursor userCursor = getContentResolver().query(Uri.parse(calanderURL), null,
null, null, null);
if(userCursor.getCount() > 0){
userCursor.moveToFirst();
calId = userCursor.getString(userCursor.getColumnIndex("_id"));
}
ContentValues event = new ContentValues();
event.put("title", "与苍井空小-姐动作交流");
event.put("description", "Frankie受空姐邀请,今天晚上10点以后将在Sheraton动作交流.lol~");
//插入[email protected]这个账户
event.put("calendar_id",calId);
Calendar mCalendar = Calendar.getInstance();
mCalendar.set(Calendar.HOUR_OF_DAY,10);
long start = mCalendar.getTime().getTime();
mCalendar.set(Calendar.HOUR_OF_DAY,11);
long end = mCalendar.getTime().getTime();
event.put("dtstart", start);
event.put("dtend", end);
event.put("hasAlarm",1);
Uri newEvent = getContentResolver().insert(Uri.parse(calanderEventURL), event);
long id = Long.parseLong( newEvent.getLastPathSegment() );
ContentValues values = new ContentValues();
values.put( "event_id", id );
//提前10分钟有提醒
values.put( "minutes", 10 );
getContentResolver().insert(Uri.parse(calanderRemiderURL), values);
Toast.makeText(CalendarDemo.this, "插入事件成功!!!", Toast.LENGTH_LONG).show();
}
}
}
第四步:在AndroidManifest.xml中申请权限,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tutor.calendardemo"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".CalendarDemo"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
</manifest>
第五步:运行上述Android工程,查看效果:
㈡ 微信小程序日历组件calendar详解及实例
微信小程序日历组件calendar详解及实例
模版使用:
src="../cal/calendar.wxml">
is="calendar"
data="{{selected_value,days,month,years,lunar_years,lunar_month,lunar_days,selectDateType,l
unar_selected_value}}">
js代码使用:
var
Calendar
=
require('../cal/calendar');
Page({
data:
{
selected_value:
[],
days:
[],
month:
[],
years:
[],
lunar_years:
[],
lunar_month:
[],
lunar_days:
[],
selectDateType:
1,
lunar_selected_value:
[]
},
....
//
指定选择器回调函数
new
Calendar('key',
this,
function(date){
that.setData({
date:
date
})
});
样式
.calendar{
position:
absolute;
bottom:
0;
width:
100%;
z-index:
999;
background-color:
#fff;
}
.tab{
display:inline-block;
width:50%;
text-align:center;
font-size:16px;
color:
#ccc;
}
.tab-bar{
background-color:
#eee;
height:
40px;
line-height:
40px;
}
.tab-bar
.active{
color:
#000;
}
.selected-item{
font-size:
28px;
}
.event-type_parent{
font-size:
14px;
}
.event-type_child{
text-align:
center;
line-height:
30px;
}
.event-type_txt{
display:
inline-block;
}
以上用法看不懂的话,具体就参考代码里面index目录下。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
㈢ 小程序日历组件加红点怎么设置
小程序日历组件加红点怎么设置?
打开微信,搜索日历组件,找到小程序后点击进入,在小程序的设置界面进行加红点的设置,即可。
㈣ 微信小程序自定义月日历怎么设置
1、打开微信,搜索日历组件。
2、找到小程序后点击进入,在小程序的设置界面进行自定义设置即可。
㈤ 微信小程序之自定义日历组件
我们单位实行的大小周工作制,即大周休息2天,小周消息一天。因这点小特殊,总有同事常记错周六这天是否上班。也因这点,在程序上需要特别体现出大小周的提示,于是需要设计一个日历组件,并在日历上标注出排班名称和大小周。最终实现图如下:
微信小程序demo提供了一个简单的日历组件,vant也提供了一个日历组件,在github上也有一些日历组件,我试用了一番,都多少存在一些不符合之处。重点说一下vant,它有几个问题:一是加载数据太大,一运行就加载至少一年以上的数据;二是样式不好控制,大小相修改一下就会变形;三是在日期上下方加文字不方便。
因为没有找到太好的组件可以引用,就自己想设计一个能方便控制的,遂有下面的设计,
1、采用grid组件显示日期,分三行,中间一行为日期具体天的数字,上面一行显示大小周提示、下面一行显示排班名称
2、采用scroll-view动态包含grid数目
3、一行显示几天,可以动态设置
1、日历头部
2、日历内容
3、日历结构体
4、具体每个月的日历算法
获取某个月的第一天和最后一天,再获取每天的星期数,循环放到grid结构体中
优点:一是加载数据量少,可控制;二是显示内容丰富,可以控制;三是也是显示可以使用slot,更加丰富
缺点:一不是专业日历组件,样式简单了些;二是加载数据量有限,grid自身也是一个组件,加载多了额外的开销肯定大起来。
㈥ 微信小程序 第三方插件的使用
各种开发其实都是有插件的,之前我以为小程序没有,没想到后来又有了,昨天动手想集成两个插件试试,没想到一波三折,这里记录一下我踩的坑
1、在微信公众平台后台,登录,设置-第三方服务-添加插件。这里以添加"极点日历"为例
注意最多只能添加5个哦
2、搜索你要的插件,并添加
添加成功后,就可以在插件管理下面看到你添加的插件了
3、在app.json中添加插件
这里的插件名可以自己随意取
这里以tx-map为例,参考它的文档
在app.json中添加相关信息
而provider即AppID,version即版本号
在项目中具体怎么使用,要看开发文档,而开发文档我发现有些插件有,有些插件并没有,反正自己多查查吧
4、在目标页面的json文件里引用该插件
注意这里的tx-map即在app.json取的那个名字,而map-route也可以自己取,这里取啥,到时候wxml里用的组件就是这个名字
5、在目标页面的wxml文件里使用该插件
如果要使用插件的 js 接口的话,在js里,使用requirePlugin(在app.json里命名的插件的名字),就能获得插件对象,比如:
6、查看效果
这个你可以尝试调整你的调试基础库版本,我之前是1.9.1,调整到2.1.1就好了。
这个真心没搞懂,因为这个错误是看心情出现的,一会儿好一会儿不好的,有点不稳定的样子,据说是降低调试基础库版本
这个也是看心情出现的(目前仍然是懵逼脸,不晓得是我错了,还是插件有问题)
㈦ 微信小程序-vant-weapp日历组件的使用(年月日)
话不多说,记录一下这个框架的使用~小程序使用轻量、可靠的小程序 UI 组件库 vant-weapp
Github源码: https://github.com/youzan/vant-weapp
中文文档: https://youzan.github.io/vant-weapp/#/intro
1:打开微信开发者工具,填写自己的appid和项目名称,选择不使用云服务,新建一个项目。
2:右击在选择在终端打开
进入项目的根目录底下,注意,一定要进入根目录哦,使用cd ../返回上一级目录~
3:小程序已经支持使用 npm 安装第三方包,
这里通过 npm 安装
这里需要注意一下
npm i vant-weapp -S --proction或者npm i @vant/weapp -S --proction
引入的区别
使用npm i vant-weapp安装的时候,到时候在在app.json或index.json中引入组件,需要使用这样的路径
使用npm i @vant/weapp安装的时候,到时候在在app.json或index.json中引入组件,需要使用这样的路径(推荐,因为这个可以直接抄文档,不需要改变引入路径的~)
4:在微信开发工具执行npm 构建,点击工具里面,构建npm
构建过程需要等待一会儿,不要捉急
构建完会生成一个miniprogram_npm文件夹
如果构建完如果编译报错,再构建一次就好了
日历文档参照一下
5:使用vant-weapp日历组件
我这里对日期的处理,是需要这样的格式YYYY-MM-dd
所以在对选中的日期做了一些处理和判断~
wxml
js
json
㈧ PC端微信小程序日历不显示是缺少插件
首先在微信小程序后台——设置——第三方服务,按AppID搜索到该插件并申请授权。
㈨ 微信小程序自定义picker年月日时分秒选择器组件
功能:
年月日时分秒,固定选择范围
效果:
自定义组件实现:
utils/datePicker.js
定义组件components/datePicker/datePicker.js
components/datePicker/datePicker.wxml
components/datePicker/datePicker.wxss
使用datePicker组件
index.json
index.wxml
index.js
㈩ 微信小程序开发实战阅读列表不出现怎么回事
小程序提供打开新页面、页面重定向、页面返回、tabBar切换四种改变视图的机制,托管了页面的生命周期,并为应用提供了相应的生命周期事件,方便应用各阶段的业务处理,但页面之间相互跳转并没有相应的事件机制,例如——
1、A页面打开二级页B,B页面做了一些操作,要通知A页面做相应的处理。
2、从B页面携带一些数据,返回到A页面
以上两种小程序场景很常见,归结为页面间如何方便的进行交互,当然我们可以通过页面跳转传参或全局数据对象来达到目的,但是使用上有些束缚(转换参数或维护全局对象),在此elong小程序项目中采用事件机制解决这一问题。我们重写了navigateToAPI,A页面调用该接口进行页面跳转后,方法返回给A页面一个事件对象 event,该对象可以注册自定义事件,目标页面(B页面)可以按照业务需求触发事件响应,同时将相关数据作为参数传递到监听处callback。
A页面微信小程序加载不出来
B页面微信小程序加载不出来
API微信小程序加载不出来
Event微信小程序加载不出来
打开二级页面效果图——微信小程序加载不出来
二、前后端同时开发过程中,前端如何方便的mock数据、特殊场景下前端如何方便的调整后端数据
涉及到http(s)接口请求数据,除了上述问题外,其实还有一些hook任务要做,比如统一的 缺省入参、日志、行为统计、超时处理等,这就需要框架层面对小程序原生接口 wx.request做一层封装以便扩展。
每个页面所需要的后端接口配置在独立service文件中,页面中引用对应的service,统一由此调用http接口,减少页面业务逻辑的复杂度。微信小程序加载不出来
url:后端接口url
params:接口入参,若配置了参数列表,则按参数列表自动序列化参数,若不配置,默认取调用接口时的第一个参数作为params
微信小程序加载不出来
method: 默认为 GET,有效值:OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
noLoading: 默认false,即每个网络接口均出现loading效果
mockData:模拟后端数据,并行开发过程中必不可少
dataTransform:转换数据,满足特殊性处理
loading效果图——微信小程序加载不出来
数据请求——微信小程序加载不出来
三、若要所有的页面支持自定义事件、业务组件扩展等功能,又不想所有的页面中添加量大的方法,这就需要框架层提供统一的机制解决,elong小程序框架在此封装了Page、require等原生方法
1、require如果提供基准目录层次__dirname
a)require非相对目录时会自动补充相等层次
b)直接调用原生require
2、未提供基准目录层次_dirname,按当前目录寻找微信小程序加载不出来
3、Page 构造函数用来注册一个页面。接受一个object参数,其指定页面的初始数据、生命周期函数、事件处理函数等,框架对Page做了重写,这样可以方便的使用扩展能力(页面事件、全局事件、内部组件、外部组件),使用时仅需将原来的业务代码用包装器包装一下即可微信小程序加载不出来
重写后的Page增加了 委托生命周期函数、扩展事件机制、内置内部组件和外部组件扩展等功能(详见overwrite.js 文件)微信小程序加载不出来微信小程序加载不出来
四、小程序中提供了模板机制
可以方便的复用一段页面(wxml)代码,但需要手动将微信小程序模板中绑定的事件、数据注册到当前页面的Page下,而且不可以出现重名属性和方法,相当于仅是一个“插入”操作,目前无法像使用原生组件一样使用一个外部的独立组件。比如,业务中有一个独立的功能日历,我们通常希望这个日历组件是独立一体的,放在一个component文件夹下,日历组件包含自己的wxml、wxss、js,其中js的事件、数据注册不受太多限制(不关心是否和使用者命名冲突等),为此 elong 小程序框架在重写Page时提供了扩展外部组件的功能。
详细使用规范——
1、wxml需要以模板的形式引入组件的wxml
2、wxss 需要引入组件的wxss
@import "filter/index.wxss";
3、js需要引入组件的js文件
var filter = require('./filter/index');
4、组件和页面见的事件传递需要在组件配置中声明微信小程序在开发时遇到的问题和处理方法
这些事件函数需要注册在页面中,组件中可以通过fireEvent的形式触发到这些事件。
5、组件中不可使用Page构造方法,因为组件不是页面,不需要注入小程序页面列表中,其他的事件函数、方法、数据的定义没有任何限制,不需要担心方法和属性的同名冲突,框架层将组件的属性和方法命名空间化赋予页面对象,并且如果组件中的方法用到this,在组件的方法执行时,框架会动态改变要操作的数据对象,保证组件中词法this就是组件的。小程序加载
*实现详见 overwrite.js > extendComponents方法