- webview加载https如下设置:
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //webview访问出net::ERR_UNKNOWN_URL_SCHEME错的解决地方 return !url.startsWith("http:") && !url.startsWith("https:"); } @Override public void onReceivedSslError(WebView webView, SslErrorHandler sslErrorHandler, SslError sslError) { sslErrorHandler.proceed(); }
2.加载https地址的图片????????????????
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
3. 如果已经启动了四个Activity:A,B,C和D,在D Activity里,想再启动一个Actvity B,但不变成A,B,C,D,B,而是希望是A,C,D,B,则可以加上:FLAG_ACTIVITY_REORDER_TO_FRONT
Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
4.在调用getDrawingCache()方法从ImageView对象获取图像之前,一定要调用setDrawingCacheEnabled(true)方法
在调用getDrawingCache()方法从ImageView对象获取图像之后,一定要调用setDrawingCacheEnabled(false)方法。
5.使一个activity的背景为前一个activity的模糊处理,在activity的onCreate之前设置flag
getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
6.软键盘弹出模式(最外层布局为LinearLayout)
输入框在底部的时候,弹出键盘页面没有任何变化,会遮住底部输入框
输入框在底部的时候,弹出键盘页面底部输入框会被软键盘挤上来,可以看到输入框底部贴着键盘
输入框在底部的时候,弹出键盘页面底部输入框整个页面会移动上去,为键盘留出空间,此时可以看到输入框底部贴着键盘
输入框在底部的时候,弹出键盘页面没有任何变化,会遮住底部输入框
- WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED
- WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
- WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN
- WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING
7.调用activity对象的finishiAffinity()方法,可以关闭当前activity所属的activity栈中所有的activity。如果所有activity都保存在默认栈中,则使用该方法会直接退出程序。
如果要回到程序的主界面,则可以在manifest文件中将主界面的activity设置为单独的栈保存。
<activity
android:name="com.weishi.UserMain"
android:taskAffinity=":finish"//该句用来指定栈
android:label="@string/title_activity_user_main" >
</activity>
8.Secure Surfaces不允许截屏,只在安全的情况下展示,比如展示一个dialog,需要在create之后再setFlags
// Make the dialog secure. This must be done at the time the dialog is
// created. It cannot be changed after the dialog has been shown.
dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);
这是activity的设置。
// Make the window secure. This must be done at the time the activity
// is created. It cannot be changed later.
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);
9.在一个DialogFramgent一个接一个展示多个dialog,需要创建多个DialogFragment的实例,并添加到stack中
void showDialog() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
DialogFragment newFragment = MyDialogFragment.newInstance();
newFragment.show(ft, "dialog");
}
10.给fragment添加动画效果
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(android.R.animator.fade_in,android.R.animator.fade_out);
11.获取手机已经安装的App信息
List<ApplicationInfo> apps = mPm.getInstalledApplications(
PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_DISABLED_COMPONENTS);
12.在xml中放置recyclerView控件,若根布局为constraintlayout,像往常一样设置recyclerView宽为match_parent高为wrap_content则有可能出现recyclerView最后一个item不显示的情况,此时需要将recyclerView布局改为如下
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvOrganization" />
13.有关文件的知识点:
/data/data/包名/cache
getCacheDir().getAbsolutePath()
/data/data/包名/files
getFilesDir().getAbsolutePath()
自己应用外部存储目录的 File,
如果用户卸载您的应用,这些文件也会被自动删除。
File externalCacheDir = getExternalCacheDir();
String absolutePath = externalCacheDir.getAbsolutePath();
///storage/emulated/0/Android/data/自己包名/cache
代表自己应用外部存储目录的文件数 ///storage/emulated/0/Android/data/自己包名/
getExternalCacheDirs().length
/storage/emulated/0/Android/data/自己包名/files/Music,如果没有Music文件夹,则会自动创建
getExternalFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath()
/system 系统根目录只读
Environment.getRootDirectory().getAbsolutePath()
/data 用户数据目录
Environment.getDataDirectory().getAbsolutePath()
/cache
Environment.getDownloadCacheDirectory().getAbsolutePath()
/storage/emulated/0
Environment.getExternalStorageDirectory().getAbsolutePath()
mounted判断存储是否可用
Environment.getExternalStorageState()
在系统根目录下创建 xwy/xwy.txt 文件夹,如果创建了几层目录,使用mkdirs都会创建,如果使用mkdir,则一个都不会创建
相反,如果只有一层的话则可以创建成功
File file = new File( Environment.getExternalStorageDirectory(),"xwy"+File.separator+"xwy.txt");
if (file.exists()){
file.delete();
}
file.mkdirs();
14.自定义View时,用Paint绘制文字,设置 isFakeBoldText =true(加粗)和通过typeFaces设置加粗是一样的,而通过设置strokeWidth(粗细)设置文字变粗则无效。
15. 除法运算 3 / 7 = 0 。。。3.0/7.0 = 0.42857142857142855 要算精确必须至少其中一个用double类型 ,之前没注意
16.viewPager获取当前显示的view,不能用viewpager.getChildAt(0),可以通过PagerAdapter的一个setPrimaryItem方法把object转为当前的view返回
17.使用ObjectAnimator对view的属性进行操作时,入参的数值类型要和view的属性类型一致,如修改translationY,view里的该属性是float类型,因此我们调用动画的时候要传入0f而不是0
18.接上面,给view设置translationY的时候,只是修改了translationY属性而已,这个属性可以认为和margin平级,因此把view挤走了,所以该view下面的其他view的位置不会变化,若要其他view跟随该view的高度向上移动,则需要改变该view的layoutParams里面的height属性(不要忘记修改了layoutParams了之后要重新给该view设置一下)
19.修改view的真实宽高只有通过修改layoutParams这一个方法
20.通过给某个字符串设置不同的样式用SpannableString返回一个SpannableString就可以直接设置到TextView上,如果加上toString()会使设置的无效。
21.众所周知,给控件设置水波纹的话简单的操作就是加上一行代码:
android:background="?android:attr/selectableItemBackground"
but,部分控件默认是不可点击的,因此会没有点击效果,需要在控件的加上:
android:clickable="true"
android:focusable="true"
22.View的移动:
1、setTranslationX/Y
2、scrollTo/scrollBy
3、offsetTopAndBottom/offsetLeftAndRight
4、平移动画
5、设置margin
23.Kotlin动态代理的坑
使用动态代理需要用到InvocationHandler这个类
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
转为kotlin就为,但是这样写会报错,AS一键转也是这个吊样:
mProxyView = Proxy.newProxyInstance(view.javaClass.classLoader, view.javaClass.interfaces,object :InvocationHandler{
override fun invoke(proxy: Any?, method: Method?, args: Array<out Any>?): Any? {
Log.e("TAG","${method?.name},${args?.size}")
if (mView==null){
return null
}
return method?.invoke(view,args)
}
}) as V
但是这样写会报错:
Caused by: java.lang.IllegalArgumentException: Wrong number of arguments; expected 0, got 1
at java.lang.reflect.Method.invoke(Native Method)
public native Object invoke(Object obj, Object... args)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException;
invoke传递可变参数,而kotlin中可变参数是 *args,其中args不能为null,所以需要改成
method.invoke(view, *args.orEmpty())
24.as点进源码显示Decompiled...这些玩意,按照百度搞了半天,要么设置sdk要么该options里面配置,都没吊用,最后把项目中build.gradle的sdk版本和什么support版本全部由28改成27就好了,坑壁东西。
25.dialog在xml里面设置固定宽高,高设置了minHeight,宽写死,然后子View设置对外层布局加上margin,结果发现margin没效果,后来加上minWidth就好了。
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="540px"
//加上这个
android:minWidth="540px"
android:layout_height="wrap_content"
android:minHeight="300px"
android:background="@drawable/bg_dialog_exit">