Android API Guides---Custom Components

Custom Components

Android提供了构建您的用户界面的基础上,基本布局类一个复杂的和强大的组件化的模式:查看和ViewGroup中。分别称为widgets和布局 - - 首先,该平台包括各种预建观的ViewGroup子类,你可以用它来构建你的UI。
可用的widget的部分名单包括ButtonTextView,EditTextListViewCheckBoxRadioButtonGallery,Spinner,和多个专用AutoCompleteTextView,ImageSwitcher和Textwatcher。
间可用的布局的LinearLayout,的FrameLayout,RelativeLayout的,等等。有关更多示例,请参见常见布局对象。
如果没有一个预定义的部件或布局满足您的需求,您可以创建自己的视图子类。如果你只需要进行小的调整,以现有的部件或布局,你可以简单地继承Widget或布局,并覆盖它的方法。
创建自己的子视图使您的屏幕元素的外观和功能的精确控制。为了让你自定义视图得到控制的想法,这里有你可以和他们做一些例子:
您可以创建一个完全自定义的渲染视图类型,例如“音量控制”旋钮使用2D图形渲染,以及它类似于一个模拟电子控制。
你可以一组View组件组合成一个新的单一成分,也许是为了让像一个ComboBox,双窗格中选择控制(左,右窗格中,在列表(弹出列表,并可以免费进入文本字段的组合)每次在那里你可以重新分配该项目是在哪个列表),依此类推。
你可以覆盖一个EditText组件的屏幕上呈现的方式(记事本教程使用这种效果良好,营造成荫,记事本页面)。
你可以捕获其他事件,如按键,并在一些自定义的方式处理它们(如游戏)。
下面的章节解释如何创建自定义视图和在应用程序中使用它们。有关详细的参考信息,请查看类。
其基本做法
下面是你需要知道要创建自己的View组件开始什么高度概括:
扩展现有的视图类或子类用自己的类。
一些覆盖从超类中的方法。这些超类方法重写开始与“开”,例如,的onDraw(),onMeasure()和的onkeydown()。这类似于上......事件活动或ListActivity你覆盖生命周期和其他功能挂钩。
使用新的扩展类。一旦完成,新的扩展类来代替它所依据的视图的使用。
提示:扩展类可以被定义为使用它们的活动里面的内部类。因为它控制对它们的访问,但没有必要的(也许您要创建在应用程序中更广泛地使用新的公共视图),这非常有用。
完全定制的组件
完全定制的组件可以用于创建却出现你想要的图形组件。也许一个图形化的VU表,看起来像一个老的模拟计,或者反弹球沿着移动的话,所以你可以将它与卡拉OK机唱唱一个长文本视图。无论哪种方式,你想要的东西,内置组件也做不了,无论你如何将它们结合起来。
幸运的是,你可以轻松地创建,看起来和任何你喜欢的方式行事成分,也许只有你的想象力,屏幕的大小和可用的处理能力(请记住,最终您的应用程序可能需要与显著少一些运行限制功率比你的桌面工作站)。
要创建一个完全定制的组件:
你可以扩展最通用的观点是,勿庸置疑,景观,所以你通常会通过扩展此创建新的超级组件启动。
可以提供一个构造可以采取属性和参数从XML,并且还可以消耗自己的这样的属性和参数(可能的颜色和范围的VU表的,或宽度和针的阻尼等)
你可能会想在你的组件类来创建自己的事件监听器,属性访问和修改,并可能更复杂的行为为好。
您将几乎肯定要覆盖onMeasure(),并也有可能需要重写的onDraw()如果您希望组件显示的东西。虽然双方都有默认的行为,默认的onDraw()会做什么,和默认onMeasure()将始终设置大小为100x100 - 这可能不是你想要的。
其他的方法...根据需要也可覆盖。
延伸的onDraw()和onMeasure()
该的onDraw()方法提供你一个帆布赖以你可以实现你想要的任何东西:2D图形,其他标准或自定义组件,样式文本,或者其他任何你能想到的。
注意:此并不适用于3D图形。如果你想使用3D图形,你必须扩展SurfaceView,而不是视图,从一个单独的线程借鉴。详情请参阅GLSurfaceViewActivity样本。
onMeasure()是一个涉及多一点。 onMeasure()是你的组件和它的容器之间的合同渲染的关键部分。 onMeasure()应该被重写,高效,准确地报告其包含部分的测量。这是通过限制从父的要求(这是在传递到onMeasure()方法)和由一旦已经计算调用setMeasuredDimension()方法测得的宽度和高度的要求稍微更复杂的。如果无法从调用一个重写的onMeasure()方法,该方法,其结果将是测量时间的异常。
在一个较高的水平,实现onMeasure()看起来是这样的:
重写的onMeasure()方法被调用,宽度和高度的度量规范(widthMeasureSpec和heightMeasureSpec参数,无论是代表尺寸整数代码),它应被视为对应产生的宽度和高度测量值的限制的要求。一个完整的参考样的这些规范可以要求限制,可以在参考文档中View.onMeasure(INT,INT)(本参考文档不解释,以及整个测量操作的一个不错的工作)下找到。
组件的onMeasure()方法应该计算出测量的宽度和高度,这将需要呈现组件。它应尽量留传入的规范之内,尽管它可以选择超过他们(在这种情况下,家长可以选择做什么,包括剪切,滚动,抛出一个异常,或要求onMeasure()再次尝试,也许不同的测量规格)。
一旦宽度和高度被计算,所述setMeasuredDimension(INT宽度,诠释高度)方法必须与计算出的测量结果被调用。如果不这样做将导致抛出异常。
下面是一些该框架的意见呼吁其他标准方法的总结:

Category Methods Description
Creation Constructors There is a form of the constructor that are called when the view is created from code and a form that is called when the view is inflated from a layout file. The second form should parse and apply any attributes defined in the layout file.
onFinishInflate() Called after a view and all of its children has been inflated from XML.
Layout onMeasure(int, int) Called to determine the size requirements for this view and all of its children.
onLayout(boolean, int, int, int, int) Called when this view should assign a size and position to all of its children.
onSizeChanged(int, int, int, int) Called when the size of this view has changed.
Drawing onDraw(Canvas) Called when the view should render its content.
Event processing onKeyDown(int, KeyEvent) Called when a new key event occurs.
onKeyUp(int, KeyEvent) Called when a key up event occurs.
onTrackballEvent(MotionEvent) Called when a trackball motion event occurs.
onTouchEvent(MotionEvent) Called when a touch screen motion event occurs.
Focus onFocusChanged(boolean, int, Rect) Called when the view gains or loses focus.
onWindowFocusChanged(boolean) Called when the window containing the view gains or loses focus.
Attaching onAttachedToWindow() Called when the view is attached to a window.
onDetachedFromWindow() Called when the view is detached from its window.
onWindowVisibilityChanged(int) Called when the visibility of the window containing the view has changed.
自定义视图示例


在API演示的CustomView示例提供了一个自定义视图的一个例子。自定义视图在LABELVIEW类中定义。


该LABELVIEW示例演示了一些自定义组件的不同方面:


扩展视图类完全自定义组件。
参数构造函数,认为通胀的参数(在XML定义的参数)。其中一些通过向视图超过去了,但更重要的是,也有定义,并用于LABELVIEW一些自定义属性。
类型的标准的公共方法,你希望看到一个标签组件,例如的setText(),setTextSize(),setTextColor()等。
一个重写onMeasure方法来确定和设置组件的呈现大小。 (注意,在LABELVIEW,真正的工作是由私人measureWidth()方法实现的。)
一个重写的onDraw()方法来绘制标签上提供的画布上。
你可以看到LABELVIEW自定义视图的一些用法示例中custom_view_1.xml从样品中。特别是,你可以看到这两个机器人的混合:命名参数和自定义应用程序:命名空间参数。这些应用程式:参数是所述LABELVIEW识别并与工作的自定义的,并在样品内部的设置样式内部类中R定义资源定义类。


复合控件


如果你不希望创建一个完全自定义的组件,而是正在寻找放在一起由一组现有的控件,然后创建一个化合物组分(或复合控制)的可重用组件可能适合该法案。简单地说,这个汇集了一批多个原子控件(或意见)转换成可以被视为一个单一的东西项目的逻辑组。例如,组合框可以被认为是作为一个单一的线的EditText场和相邻钮带有附加PopupList的组合。如果从列表中按下按钮,选择的东西,它填充的EditText领域,但用户也可以直接输入一些东西到的EditText,如果他们愿意。


在Android中,其实有另外两个意见一应俱全做到这一点:微调和AutoCompleteTextView,但无论如何,一个组合框的概念使一个容易理解的例子。


要创建复合组件:


通常的起点是某种形式的布局,以便创建一个延伸的布局的类。也许在一个组合框的情况下,我们可能会使用与水平方向的LinearLayout中。请记住,其他布局可以嵌套里面,所以该化合物成分可以是任意复杂的结构化。请注意,就像对待一个活动,您可以使用声明(基于XML的)的方式来创建包含的组件,或者你可以嵌套这些编程方式从你的代码。
在构造函数为新类,采取任何参数的超预期,并通过先通过他们的父类的构造。然后,你可以设置你的新组件中使用的其他意见;这是您将创建的EditText场和PopupList。请注意,您也可能会引入自己的属性和参数成可以拉出,并通过构造函数中使用的XML。
你还可以创建你的意见所载可能生成事件,例如监听器,为列表项目监听方法点击监听器如果列表作出选择更新的EditText的内容。
还可能与访问和修改创建自己的属性,例如,允许的EditText值在需要时被初始设置在组件和查询其内容。
在扩展布局的情况下,你并不需要重写的onDraw()和onMeasure()方法,因为布局将有默认行为可能会工作得很好。但是,您仍然可以覆盖他们,如果你需要。
你可能会覆盖其他的...方法,如的onkeydown(),或许从组合框的弹出列表时按下某个键选择某些默认值。
总之,使用布局作为用于定制控制的基础的具有许多优点,包括:


您可以使用声明的XML文件,就像与活动指定屏幕的布局,也可以以编程方式创建视图和窝他们到你的代码中的布局。
该的onDraw()和onMeasure()方法(加上...方法大多数其他的)可能将不得不合适的行为,所以你不必覆盖它们。
最后,你可以非常快速地构建任意复杂的化合物,看法和就好像它们是单一成分重新使用它们。
复合控件的例子


在附带的SDK API的演示项目中,有两个例子列表 - 示例4下查看示例6 /列表展示延伸的LinearLayout做一个组件以显示语音引号中的SpeechView。示例代码对应的类是List4.java和List6.java。


修改现有视图类型


没有用于创建自定义视图是在某些情况下很有用一种更轻松的选择。如果有已经非常相似,你想要什么组件,您可以简单地扩展该组件,只是覆盖你想改变的行为。你可以做所有你要做一个完全自定义组件做的事情,但如果用在视图层次更专业类开始,你还可以得到很多的行为自由这可能不正是你想要的东西。


例如,该SDK包括样品在记事本应用程序。这表明使用Android平台,其中正扩展一个EditText查看做出内衬记事本的许多方面。这是不是一个完美的例子,这样做可能会从这个早期预览改变的API,但它确实表明的原则。


如果你还没有这样做的话,导入记事本样品到Eclipse(或者只是看看使用提供的链接的源)。在在NoteEditor.java文件MyEditText定义特定的外观。


几点这里要注意


定义
该类定义的下面一行:
公共静态类MyEditText扩展的EditText
它被定义为NoteEditor活动内的内类,但它是公共以便它可以作为NoteEditor.MyEditText从NoteEditor类以外,如果需要的访问。
它是静态的,这意味着它不产生所谓的“合成方法”,允许它从父类,这反过来又意味着,它确实表现为一个单独的类而不是一些密切相关NoteEditor访问数据。这是创建内部类,如果他们不需要从外部类访问的状态的清洁的方式,保持所生成的类小,并允许它容易地从其它类中使用。
它扩展的EditText,这也是我们选择在这种情况下自定义视图。当我们完成后,新的类将能够代替一个正常的EditText图。
类的初始化
与往常一样,超首先被调用。而且,这不是一个默认的构造函数,而是一个参数之一。该的EditText与这些参数创建的,当它从一个XML布局文件膨胀,因此,我们的构造函数需要双方采取并将其传递给父类的构造为好。
覆盖方法
在这个例子中,只有一个方法被覆盖:)的onDraw( - 但可以很容易地在创建自己的自定义组件别人需要的。
对于记事本样品,覆盖的onDraw()方法可以让我们来画的EditText视图画布上的蓝线(画布被传递到重载的onDraw()方法)。该方法结束之前super.onDraw()方法被调用。超类方法应该被调用,但在这种情况下,我们做在结束后,我们已经绘我们要包括的行。
使用自定义组件
现在,我们有我们的自定义组件,但我们如何使用它?在记事本例中,自定义组件是直接从声明布局的,所以要在res /布局文件夹看看note_editor.xml。

<view
  class="com.android.notepad.NoteEditor$MyEditText" 
  id="@+id/note"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="@android:drawable/empty"
  android:padding="10dip"
  android:scrollbars="vertical"
  android:fadingEdge="vertical" />
定制组件被创建为在XML的通用视图,并使用完整的包中指定的类。还要注意的是我们定义的内部类是使用说明编辑引用$我的EditText符号是指内部类Java编程语言的标准方法。
如果您的自定义视图组件没有被定义为一个内部类,那么你就可以,另外,声明了XML元素名称View组件,并排除类属性。 例如:

<com.android.notepad.MyEditText
  id="@+id/note"
  ... />
请注意的EditText类现在是一个单独的类文件。当类被嵌套在注释编辑器类,这种技术将无法正常工作。
定义中的其他属性和参数传递到自定义组件构造的人,然后通过对构造的EditText传递,因此它们是在一个你想用一个EditText视图相同的参数。请注意,它可以添加自己的参数,以及,我们将在下面再碰这一点。
而这一切就是这么简单。诚然,这是一个简单的例子,但是这点 - 创建自定义组件只能作为复杂,因为你需要它的。
更复杂的成分可能更多...上覆盖的方法,并介绍了一些自己的辅助方法,大幅定制其属性和行为。唯一的限制是你的想象力,你所需要的组件做什么。


你可能感兴趣的:(java,android,api,sdk,custom,Components)