为啥在android studio 布局中使用自定义控件就报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥在android studio 布局中使用自定义控件就报错相关的知识,希望对你有一定的参考价值。

你的自定义控件只实现了一个参数的构造方法 View有三个构造方法 123public View(Context context)public View(Context context, AttributeSet attrs)public View(Context context, AttributeSet attrs, int defStyle)要在布局中使用自定义控件,控件必须实现带参数AttributeSet的构造方法,实例化布局的时候会调用这个方法去实例化控件,否则就会报你图上的错误 另外引用自定义控件的时候必须用包名.类名的方式,否则也会报错 参考技术A android Studio 是一个Android开发环境,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试。在IDEA的基础上,Android Studio 提供 : 1. 基于Gradle的构建支持。 2. Android 专属的重构和快速修复。 3. 提示工具以捕获性能、可用性、版本兼容性等问题。 4. 支持ProGuard 和应用签名。 5. 基于模板的向导来生成常用的 Android 应用设计和组件。 6. 功能强大的布局编辑器,可以拖拉 UI 控件并进行效果预览。Eclipse迁移到Android studio步骤如下:一、从Eclipse中导出:1、将ADT插件版本升级到22.0以上。2、在Eclipse中,选择File-->Export。3、在弹出的导出窗口中,打开Android的文件夹,选择“Generate Gradle Build Files”。4、选中想要导入到Android Studio中的项目,Finish。注意:导出的项目将会和原来的项目在同一目录,覆盖原来的同时,会新增一个叫build.gradle的文件,导入Android Studio时将首先读取这个文件。二、导入到Android Studio:1、在Android Studio 中,首先关掉当前的打开的项目。2、在欢迎界面,点击Import Project(注:也是可以直接在菜单选择Import project的)。3、选中Eclipse中导出的项目,展开目录,点击build.gradle文件,然后OK。4、在之后的弹出对话框中,会要求选择Gradle的配置,选中Use gradle wrapper.(注:也可以自定义本机装的Gradle)。

在 Intellij IDEA/Android Studio 中使用合并根标签预览布局

【中文标题】在 Intellij IDEA/Android Studio 中使用合并根标签预览布局【英文标题】:Preview layout with merge root tag in Intellij IDEA/Android Studio 【发布时间】:2013-06-22 04:53:43 【问题描述】:

假设我们正在开发基于 LinearLayout 的复合组件。所以,我们创建这样的类:

public class SomeView extends LinearLayout 
    public SomeView(Context context, AttributeSet attrs) 
        super(context, attrs);

        setOrientation(LinearLayout.VERTICAL);
        View.inflate(context, R.layout.somelayout, this);
    

如果我们使用LinearLayout 作为somelayout.xml 的根,我们会有额外的视图级别,所以我们使用合并标签:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_>

    <TextView
        android:layout_
        android:layout_
        android:text="Some text"
        android:textSize="20sp"/>

    <TextView
        android:layout_
        android:layout_
        android:text="Some other text"/>
</merge>

但在 IDE 中的 Preview 选项卡中,合并始终充当 FrameLayout,我们会看到类似的内容:

(就是Android Studio,Intellij IDEA也一样,关于Eclipse我就不知道了)

预览版大大加快了布局的开发速度,即使对于某些布局也失去了这么大的帮助,这很遗憾。可能有办法指定,预览应该如何解释特定布局中的merge标签?

【问题讨论】:

我希望也能添加此支持。 这可能会在未来某个时间通过工具属性解决。 code.google.com/p/android/issues/detail?id=61652 【参考方案1】:

编辑:过时的答案。请参阅 starkej2 的回答。


Android Studio 0.5.8 添加了对工具的支持:showIn。通过使用它可以预览布局。

http://tools.android.com/recent/androidstudio058released

layout/layout_merge.xml with tools:showIn:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:custom="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   tools:showIn="@layout/simple_relativelayout">

......

</merge>

layout/simple_relativelayout.xml 包含:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_
    android:layout_>

    <include layout="@layout/layout_merge"/>

</RelativeLayout>

【讨论】:

好消息!对于复合组件不是很方便,因为我们需要添加额外的布局只是为了预览。但总比没有好。 Eclipse 支持类似的想法吗? 你可以关注一张票,这里是谷歌开发者报告的:code.google.com/p/android/issues/detail?id=61652 我以编程方式为根视图(在本例中为 RelativeLayout)设置了一些属性,例如填充。当然,它们不会应用在这个辅助布局中(因为您使用的是完全不同的视图)。唯一的解决方案是在辅助布局中使用整个自定义视图。 没过时可以在你不想通用查看时使用【参考方案2】:

有一个新的 parentTag 工具属性 (added in Android Studio 2.2) 可用于指定合并标签的布局类型,这将使​​布局在布局编辑器预览中正确呈现。

所以用你的例子:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:parentTag="LinearLayout"
    tools:orientation="horizontal">

    <TextView
        android:layout_
        android:layout_
        android:text="Some text"
        android:textSize="20sp"/>

    <TextView
        android:layout_
        android:layout_
        android:text="Some other text"/>
</merge>

注意:必须同时指定 android:layout_widthandroid:layout_height 才能使布局在编辑器中正确显示。

【讨论】:

有谁知道在另一个布局文件中添加自定义视图标签时如何正确显示预览? &lt;com.yourpackage.yourcustomview id="@+id/my_cust_view" android:layout_width="match_parent" android:layout_height="match_parent"/&gt; 查看视觉差异raw.githubusercontent.com/nisrulz/android-tips-tricks/develop/… 既然你在使用工具,你也可以使用工具:layout_ 完美!谢谢。 +1【参考方案3】:

也可以使用自定义类作为父类,而不是像合并一样

<com.mycompany.SomeView xmlns:android="http://schemas.android.com/apk/res/android">
...
</com.mycompany.SomeView>

然后直接膨胀这个布局并将结果视图投射到SomeView。 Android Studio 将直接检查SomeView 的父类并像LinerLayout 一样处理预览。 您可以使用SomeView 中的onFinishInflate() 方法通过findViewById() 绑定视图。 这种方案的好处是可以将所有布局定义或样式定义直接放到布局文件中,不能在代码中使用setOrientation()之类的方法。

【讨论】:

这引入了无限递归,并且在尝试预览时堆栈溢出,使整个 Android Studio 永远挂起。

以上是关于为啥在android studio 布局中使用自定义控件就报错的主要内容,如果未能解决你的问题,请参考以下文章

为啥android studio显示“约束布局中缺少约束”的错误?

android studio中 Build Tools 已经存在22.0.1并且版本也已经改为22.0.1为啥还报错 Error

为啥 Android Studio Emulator 会扭曲背景图片

为啥 Android Studio 将我所有的引用从 R 更改为 android.R?

为啥 Android Studio 将我所有的引用从 R 更改为 android.R?

android studio 新建的工程为啥直接报红??