Android日常Bug收集及一些小知识点

  1. 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)

输入框在底部的时候,弹出键盘页面没有任何变化,会遮住底部输入框 

 输入框在底部的时候,弹出键盘页面底部输入框会被软键盘挤上来,可以看到输入框底部贴着键盘

 输入框在底部的时候,弹出键盘页面底部输入框整个页面会移动上去,为键盘留出空间,此时可以看到输入框底部贴着键盘

输入框在底部的时候,弹出键盘页面没有任何变化,会遮住底部输入框  

  1. WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED
  2. WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
  3. WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN
  4. WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING

 7.调用activity对象的finishiAffinity()方法,可以关闭当前activity所属的activity栈中所有的activity。如果所有activity都保存在默认栈中,则使用该方法会直接退出程序。

如果要回到程序的主界面,则可以在manifest文件中将主界面的activity设置为单独的栈保存。

              android:name="com.weishi.UserMain"
            android:taskAffinity=":finish"//该句用来指定栈
            android:label="@string/title_activity_user_main" >

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 apps = mPm.getInstalledApplications(
PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_DISABLED_COMPONENTS);

12.在xml中放置recyclerView控件,若根布局为constraintlayout,像往常一样设置recyclerView宽为match_parent高为wrap_content则有可能出现recyclerView最后一个item不显示的情况,此时需要将recyclerView布局改为如下

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?): 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就好了。


 

你可能感兴趣的:(Android笔记)