AndroidAnnotations——Enhance custom views 优化自定义组件

翻译 2013年12月04日 16:49:41

Enhance custom views 优化自定义组件


@EView and @EViewGroup are the annotations to use if you want to create custom components.
假如你想创建自定义组件,你可以使用@EView@EViewGroup注解。

Why should I use custom components ?为什么我需要使用自定义组件?

If you notice that you're duplicating some parts of your layouts in different locations in your app, and that you're duplicating and calling the same methods again and again to control these parts, then a custom component can probably make your life a lot easier !如果你注意到你在自己app的不同位置复用布局中的一些部分,并且你也复用一些方法,一遍又一遍地调用它们来控制这些部分,那么一个自定义组件可能使你的生活更简单。


Custom Views with @EView  使用@EView的自定义视图

Since AndroidAnnotations 2.4

Just create a new class that extends View, and annotate it with @EView. You can than start using annotations in this view:只要创建一个继承View的新类,并用 @EView注解。你就可以在这个View中开始使用注解功能了:

@EView
public class CustomButton extends Button {

        @App
        MyApplication application;

        @StringRes
        String someStringResource;

        public CustomButton(Context context, AttributeSet attrs) {
                super(context, attrs);
        }
}

You can then start using it in your layouts (don't forget the _):然后你可以在布局文件中开始使用这个视图(别忘记 _):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.androidannotations.view.CustomButton_
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <!-- ... -->

</LinearLayout>

You can also create it programmatically:你也可以用代码生成:

CustomButton button = CustomButton_.build(context);

Custom ViewGroups with@EViewGroup使用@EViewGroup的视图组

Since AndroidAnnotations 2.2

How to create it ?如何创建它?

First of all, let's create a layout XML file for this component.首先,让我们为这个组件创建一个布局xml文件。

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

    <ImageView
        android:id="@+id/image"
        android:layout_alignParentRight="true"
        android:layout_alignBottom="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/check" />

    <TextView
        android:id="@+id/title"
        android:layout_toLeftOf="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white"
        android:textSize="12pt" />

    <TextView
        android:id="@+id/subtitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/title"
        android:textColor="#FFdedede"
        android:textSize="10pt" />

</merge>

Did you know about the merge tag ? When this layout will get inflated, the childrens will be added directly to the parent, you'll save a level in the view hierarchy.你知道merge标签吗?当布局将要被inflate的时候,子视图将被直接加到父容器中,你将保存一个view层级的等级。

As you can see I used some RelativeLayout specific layout attributes (layout_alignParentRight,layout_alignBottomlayout_toLeftOf, etc...), it's because I'm assuming my layout will be inflated in aRelativeLayout. And that's indeed what I'll do !如你所见,我使用了一些相对布局中的特殊布局attributeslayout_alignParentRightlayout_alignBottom, layout_toLeftOf等等),这是因为我假设我的布局会在一个相对布局中被inflate。并且我的确会这么做!

@EViewGroup(R.layout.title_with_subtitle)
public class TitleWithSubtitle extends RelativeLayout {

        @ViewById
        protected TextView title, subtitle;

        public TitleWithSubtitle(Context context, AttributeSet attrs) {
                super(context, attrs);
        }

        public void setTexts(String titleText, String subTitleText) {
                title.setText(titleText);
                subtitle.setText(subTitleText);
        }

}

There you are ! Easy, isn't it ?成了!很简单,不是吗?

Now let's see how to use this brand new component.现在让我们看看怎么使用这个新组件。

How to use it ? 如何使用?

A custom component can be declared and placed in a layout just as any other View:一个自定义组件就和其他视图一样,可以被声明、放置在布局中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <com.androidannotations.viewgroup.TitleWithSubtitle_
        android:id="@+id/firstTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    
    <com.androidannotations.viewgroup.TitleWithSubtitle_
        android:id="@+id/secondTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    
    <com.androidannotations.viewgroup.TitleWithSubtitle_
        android:id="@+id/thirdTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

As always, don't forget the _ at the end of the component name!一如既往地,请不要忘记在组建名后加上 _。

And because I'm using AA, I can just as easily get my custom components injected in my activity and use them!因为我在使用AA,所以我可以更方便地将我的自定义组件注入到我的activity中使用。

@EActivity(R.layout.main)
public class Main extends Activity {

        @ViewById
        protected TitleWithSubtitle firstTitle, secondTitle, thirdTitle;

        @AfterViews
        protected void init() {
                
                firstTitle.setTexts("decouple your code",
                                "Hide the component logic from the code using it.");
                
                secondTitle.setTexts("write once, reuse anywhere",
                                "Declare you component in multiple " +
                                "places, just as easily as you " +
                                "would put a single basic View.");
                
                thirdTitle.setTexts("Let's get stated!",
                                "Let's see how AndroidAnnotations can make it easier!");
        }

}

Most AA annotations are available in an @EViewGroupgive it a try !大部分AA注解适用于@EViewGroup尝试一下吧!

本文档的简单示例下载

相关文章推荐

AndroidAnnotations——Enhance custom classes 优化自定义类

Enhance custom classes Since AndroidAnnotations 2.4 Enhancing custom classes 优化自定义类 You c...

Enhancing Android UI with Custom Views 通过自定义view来让你的UI更屌!

能够构建自己的UI组件对你来说有很大的优势,比如你可以完全控制你的内容的显示样式。但成为一个自定义视图专家的最好理由之一,就是你将有能力使自己的视图层级结构变得扁平化。...

Custom Components「自定义组件」翻译

这篇文章是 Google 官方文档 Custom Components 的翻译。 前言由于打算开始好好学习自定义 View 了,就打算边学边写点文章记录自己的学习过程。不知道从哪里下手,干脆看看官方的...

【Unity 3D】学习笔记十一:自定义风格组件(Custom Styles)

Unity 学习笔记十一   学习资料:《Unity 3D游戏开发》 宣雨松   自定义风格组件可以设置一组特殊的组件。用来满足系统提供的组件无法满足的需求。   首先在project视图...

yii2 添加 自定义 组件 custom component,以及模块 module 原理的详解剖析

本文主要说的是两种情况: 1.在yii2中自定义全局组件:yii2 custom component 2. yii2模块中自定义组件的实现方式:yii2  module  custom compo...

【Unity 3D】学习笔记十一:自定义风格组件(Custom Styles)

转载自:http://blog.csdn.net/u013289188/article/details/29367257 自定义风格组件可以设置一组特殊的组件。用来满足系统提供的组件无法...

AndroidAnnotations——Injecting Views视图注入

Injecting Views视图注入 Since AndroidAnnotations 1.0 @ViewById The @ViewById annota...

vici mvc开发第九篇——Custom Controls(自定义控件)

一、Creating a custom control classvici mvc框架容许你创建自己的控件,这些控件你可以在任何时候调用,也可以绑定到任何一个窗体,当然这个窗体必须与控件建立一些关系。...

Custom Animation——自定义动画

This example shows how to use postcompose and vectorContext to animate features. Here we choose ...

Unity/UI —— 使用字符图片自定义字体(Custom Font)

在Unity的UI设计中,我们经常会遇到需要自定义字体的情况。毕竟Unity自带的字体只有Arial一种,根本无法满足人民群众对于美的向往。当然,全能的Unity支持我们导入或创建字体,并可以在GUI...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AndroidAnnotations——Enhance custom views 优化自定义组件
举报原因:
原因补充:

(最多只允许输入30个字)