//从源码中可以看出,tryNotifyDateSet在onStop中也调用了一次,所以会造成执行两次。
public void onClick(DialogInterface dialog, int which) {
tryNotifyDateSet();
}
@Override
protected void onStop() {
tryNotifyDateSet();
super.onStop();
}
private void tryNotifyDateSet() {
if (mCallBack != null) {
mDatePicker.clearFocus();
mCallBack.onDateSet(mDatePicker, mDatePicker.getYear(),
mDatePicker.getMonth(), mDatePicker.getDayOfMonth());
}
}
解决方案:
1. 用标志位
2. 重写onStop方法
try {
//分钟是mMinuteSpinner
Field hourSpinnerField = timePicker.getClass().getDeclaredField("mHourSpinner");
hourSpinnerField.setAccessible(true);
NumberPicker hourSpinner = (NumberPicker) hourSpinnerField.get(timePicker);
hourSpinner.setMaxValue(maxHour);
} catch (Exception e) {
e.printStackTrace();
}
completeVehicleDataEt.setTransformationMethod(new ReplacementTransformationMethod());
ReplacementTransformationMethod replacementTransformationMethod = new ReplacementTransformationMethod() {
@Override
protected char[] getOriginal() {
char[] lower = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
return lower;
}
@Override
protected char[] getReplacement() {
char[] upper = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
return upper;
}
};
newSims = new HashMap<>();
in.readMap(newSims , Sim.class.getClassLoader());
dest.writeMap(newSims);
//重点:具体的某个tab是第二层view了。但这里最好try catch,防止兼容性问题。
val tabView = if (tab_layout?.getChildAt(0) != null) tab_layout?.getChildAt(0) as ViewGroup else return
val view = tabView.getChildAt(position) ?: return
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler(){
@Override
public void uncaughtException(Thread t, Throwable e) {
}
};
FLAG_ACTIVITY_NO_HISTORY
新打开的activity不在stack中保留,一旦离开,就从stack中移出。
FLAG_ACTIVITY_FORWARD_RESULT
A启动B,B启动C,然后C要把结果返回给A,那么B在启动C的时候需要加上这个标志。
用户主动离开的时候会回调
用户正在与activity交互的时候会回调,如果你想知道用户用某种方式和你正在运行的activity交互,可以重写Activity#onUserInteraction()。
所有调用Activity#onUserLeaveHint()的回调都会首先回调Activity#onUserInteraction(),所以点击跳转的时候该方法会执行两次。
CountDownLatch ,CycliBarrier,Semaphore
CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同:
CountDownLatch(countDown())一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;
而CyclicBarrier(await())一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;
另外,CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的。
Semaphore(aquire() , release())其实和锁有点类似,它一般用于控制对某组资源的访问权限。
标题导致的,解决方法:
//第二个参数 0 代表null
setStyle(DialogFragment.STYLE_NO_TITLE , 0);
5.0以后没问题,5.0以前如下图:
错误详情:
Error:Execution failed for task ':LogEx:transformClassesAndResourcesWithSyncLibJarsForRelease'.
> java.io.IOException: Could not delete path 'F:\ASworkspace\Klicen-Android\LogEx\build\intermediates\bundles\default\libs\android-logging-log4j-1.0.3.jar'.
解决方案:
根据路径去文件夹中找到该文件,然后删除,会发现不能删除,查看是什么程序在占用,强制杀掉再删除。
//给启动activity设置下面style
<item name="android:windowContentOverlay">@nullitem>
<item name="android:windowBackground">@mipmap/home_bgitem>
LayoutTransition transition = container.getLayoutTransition();
transition.enableTransitionType(LayoutTransition.CHANGING);
//子view显隐时候的动画
android:animateLayoutChanges="true"
public class DepthPageTransformer implements ViewPager.PageTransformer {
private static final float MIN_SCALE = 0.75f;
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position <= 0) { // [-1,0]
// Use the default slide transition when moving to the left page
view.setAlpha(1);
view.setTranslationX(0);
view.setScaleX(1);
view.setScaleY(1);
} else if (position <= 1) { // (0,1]
// Fade the page out.
view.setAlpha(1 - position);
// Counteract the default slide transition
view.setTranslationX(pageWidth * -position);
// Scale the page down (between MIN_SCALE and 1)
float scaleFactor = MIN_SCALE
+ (1 - MIN_SCALE) * (1 - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0);
}
}
alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(Color.parseColor("#1C7FFD"));
//重要,设置了这一句点击才有效
tv.setMovementMethod(LinkMovementMethod.getInstance());
textview.setHighlightColor(getResources().getColor(Android.R.color.transparent));
ClickableSpan span = new ClickableSpan() {
@Override
public void onClick(View widget) {
// do sth.
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(getResources().getColor(R.color.link_color));
ds.setUnderlineText(false);
}
};
<style name="AlarmSetting.Switch">
<item name="colorControlActivated">@color/data_content_mileageitem>
<item name="colorSwitchThumbNormal">@color/main_hint_coloritem>
<item name="android:colorForeground">@color/data_lineitem>
style>
Ripple
public static OkHttpClient getUnsafeOkHttpClient() {
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
//0khttp3.0以前这里是返回null
return new X509Certificate[]{};
}
}};
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
final HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory);
builder.hostnameVerifier(hostnameVerifier);
OkHttpClient okHttpClient = builder.build();
Log.d(TAG, "");
return okHttpClient;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
第三个参数可以控制是否倒序显示
5.0以后,如果要隐式启动Service,要加上包名:
intent.setpackage()