因為日歷是系統自帶的,所以讀寫它一定要申請許可權,也就是在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方法