安卓banner – 隐藏daimajia.slider的banner底部弹出介绍

实际上就是复写一下descriptionAnimation的onNextItemAppear方法

创建一个新的类使用接口BaseAnimationInterface

主要是把setVisibility(View.INVISIBLE) 修改成 setVisibility(View.GONE)

@Override
public void onNextItemAppear(View view) {

    View descriptionLayout = view.findViewById(R.id.description_layout);
    if(descriptionLayout!=null){
        float layoutY = ViewHelper.getY(descriptionLayout);
        view.findViewById(R.id.description_layout).setVisibility(View.GONE);
        ValueAnimator animator = ObjectAnimator.ofFloat(
                descriptionLayout,"y",layoutY + descriptionLayout.getHeight(),
                layoutY).setDuration(500);
        animator.start();
    }

}

然后在activity里设置自定义动画就可以啦

// 设置TextView自定义动画
sliderShow.setCustomAnimation(new ChildAnimationExample());

image.png

Android在web view下点击返回键直接退出程序完美解决

复写onkeyDown

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        WebView webView = (WebView) findViewById(R.id.web_view);
        
        if(webView.canGoBack()){
            webView.goBack();
            return true;
        }
    }
    return super.onKeyDown(keyCode, event);
}

当手机的返回键时 使用webview的goBack

Android Avtivity的启动模式

活动的启动模式一共有四种分别是standard、singleTop、singleTask和singleInstance,可以在AndroidManifest中通过给<activity>标签指定android:launchMode属性来选择启动模式。

standard(标准模式)

standard是活动的默认启动模式,在不进行显示指定的情况下,所有的活动都会自动使用这种启动模式,在standard模式下,每当启动一个新的活动,他就会在返回栈中入栈,并处于栈顶的位置。对于standard模式的活动,系统不会在乎这个活动是否已经在栈中存在,每次启动都会创建该活动的一个新的实例,一个任务栈可以有多个实例,,每个实例也可以属于不同的任务栈,在这种模式下,谁启动了这个Activity,那么这个Activity就在启动它的那个Activity所在的栈中。所以我们用ApplicationContext去启动standard模式的活动的时候就会报错,原因是非Activity类型的Context(如ApplicationContext)并没有所谓的任务栈,解决这个问题就是为待启动的活动指定FLAG_ACTIVITY_NEW_TASK标记位,这样启动的时候就会为它创建一个新的任务栈,这个时候待启动的Activiy就是以singleTask模式启动的

singleTop(栈顶复用模式)

当活动的启动模式指定为singleTop时,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例,所以该活动的onCreate和onStart方法不会被系统调用,因为它并未发生改变,但同时它的onNewIntent方法会被回调,使用singleTop模式可以很好地解决重复创建栈顶活动的问题,但是如果该活动没有处于栈顶,还是可能会重复创建多个同一个活动的实例,下面讲singleTask

singleTask(栈内复用模式)

当活动模式指定为singleTask时,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把这个活动之上的所有活动统统出栈,和singleTop一样,系统也会回调onNewIntent方法,如果没有发现就会创建一个新的活动实例。具体一点,当一个具有singleTask模式的Activity A要请求启动的时候,系统首先会去找是否存在A想要的任务栈,如果不存在就去创建一个,将A压入栈,如果存在A所需的任务栈,这时要看该任务栈例是否有A的实例存在,如果不存在就创建一个A的实例并压入栈顶,如果存在,系统就会把A调到栈顶并调用它的onNewIntent方法。

singleInstance(单实例模式)

这时一种加强的singleTask模式,它除了具有singleTask模式的所有特性外,还加强了一点,那就是具有此种模式的Activity只能单独地位于一个任务栈中,比如Activity A是这种模式,当A启动后,系统会为它创建一个任务栈,然后A单独在这个任务栈中,由于栈内复用的特性,后续的请求都不会创建新的Activity,除非这个任务栈被销毁了。这样做有什么意义呢?假设我们的程序中有一个活动是允许其他程序调用的,如果想实现其他程序和这个程序共享这个活动的实例该如何实现呢?其他三个模式肯定是做不到的,因为每个应用程序都有它自己的任务栈,同一个活动在不同的返回栈中入栈是必然会创建新的实例,所以这时候我们用singleInstance模式就可以很好地解决这个问题,不管是哪个应用程序来访问这个活动,都共用同一个返回栈,也就解决了共享活动实例的问题。

UTC时间与北京时间

经常混淆于此,特地研究了一下,记录在此以备忘。 

 

整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。在本文中,UTC与GMT含义完全相同。 

 

北京时区是东八区,领先UTC八个小时,在电子邮件信头的Date域记为+0800。如果在电子邮件的信头中有这么一行: 

 

Date: Fri, 08 Nov 2020 09:42:22 +0800 

 

说明信件的发送地的地方时间是二○○二年十一月八号,星期五,早上九点四十二分(二十二秒),这个地方的本地时领先UTC八个小时(+0800, 就是东八区时间)。电子邮件信头的Date域使用二十四小时的时钟,而不使用AM和PM来标记上下午。 

 

以这个电子邮件的发送时间为例,如果要把这个时间转化为UTC,可以使用一下公式: 

 

UTC + 时区差 = 本地时间 

 

时区差东为正,西为负。在此,把东八区时区差记为 +0800, 

 

UTC + (+0800) = 本地(北京)时间 (1) 

 

那么,UTC = 本地时间(北京时间))- 0800 (2) 

 

0942 – 0800 = 0142 

 

即UTC是当天凌晨一点四十二分二十二秒。如果结果是负数就意味着是UTC前一天,把这个负数加上2400就是UTC在前一天的时间。例如,本地(北京)时间是 0432 (凌晨四点三十二分),那么,UTC就是 0432 – 0800 = -0368,负号意味着是前一天, -0368 + 2400 = 2032,既前一天的晚上八点三十二分。 

 

纽约的时区是西五区,比UTC落后五个小时,记为 -0500: 

 

UTC + (-0500) = 纽约时间 (3) 

 

UTC = 纽约时间 + 0500 (4) 

 

把(2)式 - (4)式相比较, 

 

UTC = 北京时间 - 0800 = 纽约时间 + 0500 (5) 

 

即 北京时间 = 纽约时间 + 1300 (6) 

 

即北京时间领先纽约时间十三个小时,由(6)式, 

 

纽约时间 = 北京时间 - 1300 (7) 

 

在四月下旬,纽约又换用夏令时,又称为日光节约时,比标准纽约时间提前一个小时,实际成为西四区的标准时间,成为 -0400。 

 

UTC + (-0400) = 纽约夏令时,套用以上公式, 

 

北京时间 = 纽约夏令时 + 1200 

 

纽约夏令时 = 北京时间 - 1200 

 

在这些转换中,最重要的公式就是 

 

UTC + 时区差 = 本地时间 

 

时区差东为正,西为负。例如,东八区(北京)是 +0800,西五区(纽约)是-0500,加州是西八区,是-0800,美国中部时区是西六区,-0600,美国山地时区是西七区,-0700,太平洋时区是西八区,-0800,在夏天使用夏时制,成为-0700。德国时区是东一区,+0100,夏天变为+0200。 

 

多数电子邮件程序,例如Outlook Express,在显示时间时,计算机程序把时间先转换成为本地时间再显示,例如,邮件的Date域为: 

 

Date: Fri, 08 Nov 2020 09:42:22 +0800

mysql替换指定位置内容

方便的替换掉expiry date 而不影响其他内容

select 
concat(
substring(remarks , 1, LOCATE('Expiry Date: ', remarks)+CHAR_LENGTH('Expiry Date: ') -1),
'31-05-2020
'
,substring(remarks , LOCATE('Partner Ref No', remarks), CHAR_LENGTH(remarks) )
) as remarks
from voucher_action where id = 3359116

image.png

人人商城 – 手机端多模版

目前人人商城不支持手机端页面的多模版

/addons/ewei_shopv2/core/web/sysset/index.php 

function shop 添加 

$data['mobile_default_template'] = isset($_POST['data']['mobile_default_template']) && !empty($_POST['data']['mobile_default_template']) ? $_POST['data']['mobile_default_template'] : 'default';

/addons/ewei_shopv2/template/web_v3/sysset/index.html

添加

            <div class="form-group">
                <label class="col-lg control-label">手机端默认模版</label>
                <div class="col-sm-9 col-xs-12">
                    <input class="form-control" name="data[mobile_default_template]" 
                    value="{php echo isset($data['mobile_default_template']) && !empty($data['mobile_default_template']) ? $data['mobile_default_template'] : 'default'}"/>
                </div>
            </div>

这样就能把模版名存到数据库的(ims_ewei_shop_sysset)表了,存进去的时候是序列化过的 所以存取的修改也比较简单

addons/ewei_shopv2/core/inc/page.php

line:376

有一个后端加载前端默认模版的地方

image.png修改成

$template = $_W['shopset']['shop']['mobile_default_template'];

然后再把模版里用到mobile/default的地方的default统一修改成“$_W['shopset']['shop']['mobile_default_template']”就可以了

CRM API submit and resubmit by VMS Verification

#first CRM API submit and VMS resubmit or reimbruse
select concat(a.prefix, a.voucher_text, a.suffix), b.* from voucher a, (
	select a.submit_time, b.action_id, a.voucher_id from (
		select min(a.action_time) as submit_time, a.voucher_id 
		from voucher_action a, voucher b 
		where a.action_id = 60 and a.user_id = 3324 
		and a.voucher_id = b.voucher_id
		group by a.voucher_id
	) a left join voucher_action b on (a.voucher_id = b.voucher_id and b.action_id in (70) and b.user_id != 3324)
	where b.id is not null
	
) b where a.voucher_id = b.voucher_id

mysql直接copy数据文件 导致Table doesn’t exist的解决办法

服务器迁移后把原来的mysql data复制进去后大部分表是可以访问的,但是有几个表提示表不存在:

error: 1146: Table 'a_content' doesn't exist

这种情况就是要把原来mysql安装目录data里的 ibdata1 也要拷贝过去

INNODB是MYSQL数据库一种流行的数据库引擎,支持事务(行级),在企业级应用上成为可能

ibdata用来储存文件的数据,而库名的文件夹里面的那些表文件只是结构而已,由于新版的mysql默认试innodb,所以ibdata1文件默认就存在了,少了这个文件有的数据表就会出错。