Android Studio自定义视图没有办法预览

我想大家应该都和我一样,如果看到布局的编码的时候如果右边能够非常直观地显示出对应的视图,心里会非常舒心,像官方提供的tools命名空间就是为了这个目的而存在的。而且如果视图能够预览,其实无形中能够提高我们的开发效率。

但是,是不是总有一些时候,你会发现右边的预览界面出了问题,怎么也显示不出来?这个时候,在以前我,我也会吐嘈一句,谷歌开发的什么垃圾,连预览这种简单的功能都做不好吗?然而,其实大多数情况下,垃圾的是我自己。

尝试来重现这个情况,首先我定一个一个布局文件:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><com.example.xmlpreviewdemo.MyTextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

可以看到这个xml文件中使用了我们自定义的视图MyTextView,相信大家也能感觉到,只有自定义的视图才会出现无法预览的问题,但是官方的视图就从来不会出现对应的问题。OK,我们来看一下自定义视图的实现,

class MyTextView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : TextView(context, attrs, defStyleAttr) {override fun onFinishInflate() {if(MyApplication.application == null){throw NullPointerException("two param constructor cannot invoke application!")}super.onFinishInflate()}
}

这段代码演示了在视图流程相关方法中引用到Application的context的情况,其实我们的项目中像获取Bitmap这些资源的方法,默认不传context的情况就是直接将Application充当context进而获取到相关的资源。然后在预览的过程中就出现问题了,我们都知道预览功能说到底只是对于xml的解析,然后根据其中的资源生成对应的图像显示出来,所以没有必要单纯为了预览这么一个简单的插件功能去专门启动一个应用,所以当然就不会设置Application,所以在生成对应布局的时候当然会出现问题。解决这个问题也很简单,将视图中将Application充当context的地方改为通过getContext()方法获取就行了。

另外,其实Android Studio也是给足了提示,看见预览窗口右上角这个红色的感叹号了吗?这说明了界面的绘制出现了问题,点击就能看到出现问题的原因,所以为了我们工作能更加快乐,大家还是多留意一下这个问题吧

这是IDE给出的Exception Stack,你看,我们就能看到这里无法预览的原因就在将Application充当Context。

java.lang.NullPointerException: two param constructor cannot invoke application!at com.example.xmlpreviewdemo.MyTextView.onFinishInflate_Original(MyTextView.kt:13)at com.example.xmlpreviewdemo.MyTextView.onFinishInflate(MyTextView.kt)at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:876)at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:72)at android.view.LayoutInflater.rInflate(LayoutInflater.java:837)at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:866)at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:72)at android.view.LayoutInflater.rInflate(LayoutInflater.java:837)at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)at android.view.LayoutInflater.inflate(LayoutInflater.java:515)at android.view.LayoutInflater.inflate(LayoutInflater.java:394)at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:323)at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:394)at com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary.java:200)at com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:572)at com.android.tools.idea.rendering.RenderTask.lambda$inflate$5(RenderTask.java:698)at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)

Android Studio自定义视图无法预览相关推荐

  1. android xml 预览,解决Android studio xml界面无法预览问题

    解决Android studio xml界面无法预览问题 发布时间:2020-10-05 18:48:37 来源:脚本之家 阅读:140 作者:张雨明 如下图 修改style.xml中的 parent ...

  2. android studio显示布局距离,Android Studio:在布局预览中显示的距离在设备上显示为较大...

    在EditTexts旁边放置按钮行.每行应该是一个LinearLayout或RelativeLayout,并且您应该为每个行设置android:height ="wrap_content&q ...

  3. Xamarin XAML语言教程Visual Studio中实现XAML预览

    2019独角兽企业重金招聘Python工程师标准>>> Xamarin XAML语言教程Visual Studio中实现XAML预览 每次通过编译运行的方式查看XAML文件效果,需要 ...

  4. 视图-叠印预览_使用预览视图显示摄像机预览

    视图-叠印预览 A common use case for any camera app is to display a preview from the camera. So far, this h ...

  5. android+自定义皮肤,android studio自定义更换皮肤详细图文教程

    android studio这款app程序开发软件内也内置了多种皮肤主题,程序开发人员如果感觉一种皮肤太过单调乏味,可以选择使用软件内的其他皮肤风格,软件默认的皮肤是IntelliJ,还有黑色的Dra ...

  6. android 自定义皮肤,Android Studio 自定义皮肤主题和背景

    新的一年,新的开始,在这里先祝福大家在新的一年收获多多,多升职,多加薪,代码没BUG. 第一 Android Studio自定义皮肤主题-ColorThemes 寒假期间有人问我, "你代码 ...

  7. Visual Studio 2017 15.3 预览版发布,接近最终版

    从Visual Studio 2017 15.3预览版的发布时间表中可以看出,Microsoft似乎马上要发布这一版本的正式版.过去几周对VS2017 15.3的改动主要集中在问题修复上,开发人员可以 ...

  8. android 组件消失了,Android 12 2.2 开发者预览版发布:修复桌面小组件消失等问题...

    IT 之家 4 月 8 日消息 据外媒 XDA 论坛消息,Android 12 2.2 开发者预览版今日发布,同时包含安卓 2021 年 4 月安全更新.本次预览版主要修复了一些错误,没有带来重要功能 ...

  9. android 摄像头比例,Android摄像头是全屏预览最简单的方式.doc

    Android摄像头是全屏预览最简单的方式 Android Camera做全屏预览之最简单方法 M厂开发五部:刘 博 一.全屏预览与非全屏预览的区别 对于大多数人来说,我们看电影.玩游戏等都喜欢全屏, ...

最新文章

  1. java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得
  2. mysql 导入数据 1215_12、mysql导入数据
  3. SPOJ LCS Longest Common Substring
  4. 软件工程python就业方向-女生学习软件工程专业就业怎么样?
  5. Windows环境下32位汇编程序设计C版code--第五章(一)
  6. vector相关习题
  7. java thread类_java多线程之Thread类
  8. Tech·Ed 2007大会课程内容
  9. 关于CacheLookup一个有趣的问题
  10. 第10章 springboot是什么
  11. 小公司出来的产品经理被大厂鄙视?
  12. WORD如何隐藏选中内容?
  13. leetcode319 Bulb Switcher
  14. mysql 节假日判断,sql 节假日判断(春节、中秋、国庆、周末等)
  15. html英文字母大小,英语字母书写笔顺 英语 , 26个英文字母大小写规范书写技巧...
  16. helper java_Helper 类在Java和C++中的设计
  17. java中的0x00代表什么
  18. 联想小新一键恢复小孔_【联想自带一键重装系统】联想自带一键重装小孔_联想自带一键恢复...
  19. FTPClientUtil FTP客户端工具
  20. python+ opencv实现摄像头实时人脸识别并实现汉字标框

热门文章

  1. php图片写入带问号_php实现图片上传时添加文字和图片水印技巧
  2. 利用循环神经网络生成唐诗_【机器学习】【期末复习】闲聊神经网络 分类
  3. zlib和openssl相关库错误的解决
  4. matlab 通过矩阵变换使图像旋转平移_opencv图像处理——几何变换
  5. python如何进行数据抓取_如何进行手机APP的数据爬取?
  6. 测试两个主机之间的连通性_UCloud 全链路大规模网络连通性检测系统详解
  7. android 回收站设计,android-如何根据屏幕尺寸设置回收站视图项目的宽度尺寸?...
  8. Java动态excel模板
  9. 【深度学习】逆卷积(Deconvolution)概述
  10. 【深度学习】Pytorch的深度神经网络剪枝应用