首页 文章 精选 留言 我的

精选列表

搜索[UI库],共10000篇文章
优秀的个人博客,低调大师

Android UI学习 - ListView

ListActivity ListActivity是一个专门显示ListView的Activity类,它内置了ListView对象,只要我们设置了数据源,就会自动地显示出来。 使用custom view for screen layout 虽然ListActivity内置了ListView对象,但我们依然可以使用custom view,通过在onCreate()里面调用setContentView(resources id)。 不过要注意的是,在自定义的Layout里面,要设置ListView对象的id为"@android:id/list";在Java代码里使用android.R.id.list。 下面的例子,通过添加一个id为android:empty的TextView,当ListView里面没有data的时候,就会显示"No data"。 自定义的View (listview.xml): <? xml version ="1.0" encoding ="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:layout_width ="fill_parent" android:layout_height ="fill_parent" > < ListView android:id="@id/android:list" android:layout_width ="fill_parent" android:layout_height ="fill_parent" android:layout_weight="1" /> < TextView android:id="@id/android:empty" android:layout_width ="fill_parent" android:layout_height ="wrap_content" android:text ="No data" android:textColor ="#ff0000" /> </ LinearLayout > 加载Layout: @Override public voidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listview); //没有设置data source } Row Layout 官方提供了多种ListItem的Layout (R.layout),以下是较为常用的,更多的请查看API DOC的R.layouthttp://androidappdocs.appspot.com/reference/android/R.layout.html: android.R.layout.simple_list_item_1 一行text android.R.layout.simple_list_item_2 一行title,一行text android.R.layout.simple_list_item_single_choice 单选按钮 android.R.layout.simple_list_item_multiple_choice 多选按钮 android.R.layout.simple_list_item_checked checkbox 我们可以自定义自己的Layout (list_item.xml): <? xml version ="1.0" encoding ="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="horizontal" android:layout_width ="fill_parent" android:layout_height ="fill_parent" > < ImageView android:id ="@+id/icon" android:layout_width ="48dip" android:layout_height ="48dip" /> < TextView android:id ="@+id/text" android:layout_gravity ="center_vertical" android:layout_width ="0dip" android:layout_weight ="1" android:layout_height ="wrap_content" /> </ LinearLayout > 使用时,以R.layout.list_item引用就行了。可以参考http://androidappdocs.appspot.com/resources/tutorials/views/hello-listview.html。 绑定数据 通过调用SetListAdapter(ListAdapter adapter)就可实现。我们可以implements ListAdapter来自定义自己的数据源。API内置了几个implements ListAdapter的Adapter:BaseAdapter,SimpleAdapter(以Map的形式存储静态数据),SimpleCursorAdapter(用于游标查询的结果)等等。通常我们更多地extends BaseAdapter来编写自己的Adapter类,因为BaseAdapter类是其他Apdater类的基类。扩展BaseAdapter类一般都需要重写以下方法: int getCount() 获取当前Adapter的Items数目 Object getItem(int position) 获取相应position的Item long getItemId(int position) 获取相应position的Item在List中的row id View getView(int position, View convertView, ViewGroup parent) 获取在指定position所要显示的data的View 详细内容可以查看BaseAdapter类的继承android.widget.Adapter的方法,有时也需要重写ListAdapter的boolean isEnabled(int position)来实现某些效果。 接下来看看几个绑定数据的例子: 1. 使用ArrayAdapter public voidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //参考ArrayAdapter的构造函数 setListAdapter( newArrayAdapter<String>( this, android.R.layout.simple_list_item_1, mStrings)); //在ListView上输入字母,就会自动筛选出以此内容开头的Item getListView().setTextFilterEnabled( true); } privateString[] mStrings = { "A", "Android", "机器人", "Google"}; 2. 使用SimpleCursorAdapter 这是Sample里面List3例子,通过读取通讯录android.provider.Contacts.Phones的资料,显示出来。 protected voidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get a cursor with all phones Cursor c = getContentResolver().query(Phones.CONTENT_URI, null, null, null, null); startManagingCursor(c); // Map Cursor columns to views defined in simple_list_item_2.xml ListAdapter adapter = new SimpleCursorAdapter( this, android.R.layout.simple_list_item_2, c, newString[] { Phones.NAME, Phones.NUMBER }, new int[] { android.R.id.text1, android.R.id.text2 }); setListAdapter(adapter); } 3. ListItem为单选按钮 public voidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //参考ArrayAdapter的构造函数 setListAdapter( newArrayAdapter<String>( this, android.R.layout.simple_list_item_single_choice, mStrings)); finalListView listView = getListView(); listView.setItemsCanFocus( false); listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); //设置单选模式 } privateString[] mStrings = { "A", "Android", "机器人", "Google"}; 4. ListItem为多选按钮 把例子3的设置为android.R.layout.simple_list_item_multiple_choice以及选择模式ListView.CHOICE_MODE_MULTIPLE。 更多的例子可以参考官方的Sample,在此列出相关List的示例说明: List1 - 使用ArrayAdapter并setTextFilterEnabled(true) List2 - 使用SimpleCursorAdapter读取通讯录People.NAME List3 - 使用SimpleCursorAdapter读取通讯录Phones,两行显示Item List4 - 使用自定义Adapter以及自定义ItemView List5 - 带有separator的ListView,通过自定义Adapter,重写boolean isEnabled(int position) List6 - 使用自定义Adapter以及自定义ItemView,可伸展隐藏内容 List7 - 使用SimpleCursorAdapter读取数据 List8 - 展现使用setEmptyView效果 List9 - 涉及OnScrollListener List10 - ListItem为单选按钮 List11 - ListItem为多选按钮 List12 - 可以动态添加ListItem List13 - 如何加快操作显示,during scrolls or flings的时候 List14 - 如何编写高效的List Adapter 其中List14,官方告诉我们: To work efficiently the adapter implemented here uses two techniques: * - It reuses the convertView passed to getView() to avoid inflating View when it is not necessary * - It uses the ViewHolder pattern to avoid calling findViewById() when it is not necessary 还告诉了我们 ViewHolder类的作用: * The ViewHolder pattern consists in storing a data structure in the tag of the view returned by * getView(). This data structures contains references to the views we want to bind data to, thus * avoiding calls to findViewById() every time getView() is invoked. 另外在以上的例子里面了解到,使用自定义Adapter,当数据发生变化后需要调用notifyDataSetChanged()来刷新ListView,但在List12的例子,使用ArrayAdapter却没有调用这方法,而随后自己写代码,在发生的异常里面了解到BaseAdapter,ArrayAdapter是会调用自己的notifyDataSetChanged()。可以查看后面的文章《有关Android线程的学习》里面的例子! ListView的事件响应 通常我们响应ListItem的点击事件:protected void onListItemClick(ListView l, View v, int position, long id),在此不详细讲了,理解该函数里面的参数意义就行了。 本文转自 Icansoft 51CTO博客,原文链接: http://blog.51cto.com/android/336162

优秀的个人博客,低调大师

Android UI学习 - TableLayout

TableLayout和我们平时在网页上见到的Table有所不同,TableLayout没有边框的,它是由多个TableRow对象组成,每个TableRow可以有0个或多个单元格,每个单元格就是一个View。这些TableRow,单元格不能设置layout_width,宽度默认是fill_parent的,只有高度layout_height可以自定义,默认是wrap_content。 单元格可以为empty,并且通过android:layout_column可以设置index值实现跳开某些单元格。在TableRow之间,添加View,设置layout_height以及背景色,就可以实现一条间隔线。android:layout_span可以设置合并几个单元格: <?xmlversion="1.0"encoding="utf-8"?> <TableLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TableRow> <TextView android:text="column1" android:padding="3dip"/> <TextView android:text="column2" android:padding="3dip"/> <TextView android:text="column3" android:padding="3dip"/> </TableRow> <TableRow> <TextView android:text="column11" android:visibility="invisible"/>//cell不见了 <TextView android:text="左边的invisible" android:gravity="right" android:padding="3dip"/> <Button android:id="@+id/go" android:text="go" android:padding="3dip"/> <Button android:text="cancel" android:padding="3dip"/> </TableRow> <View//间隔线 android:layout_height="2dip" android:background="#F00"/> <TableRow> <TextView android:text="右边的cellempty"/> <TextView android:layout_column="2" android:text="跳开emptycell" android:padding="3dip"/> </TableRow> <TableRow> <TextView android:text="合并3个单元格" android:layout_span="3" android:gravity="center_horizontal" android:background="#FFC0C0C0" android:textColor="#f00" android:padding="3dip"/> </TableRow> </TableLayout> 没有设置收缩/伸展效果 注意,原来没有添加 android:padding="3dip" 的,发现那些column会凑在一起的,没有空白间隔!明显看到,那个cancel按钮被挤到几乎看不见了!这时候需要使用android:shrinkColumns="可收缩的column",android:stretchColumns="可伸展的column"。 android:shrinkColumns和android:stretchColumns的值都是以0开始的index,但必须是string值,即用"1,2,5"来表示。可以用"*"来表示all columns。而且同一column可以同时设置为shrinkable和stretchable。 如果使用TableLayout类的 setColumnShrinkable/setColumnStretchable (int columnIndex, boolean isShrinkable)就麻烦些了,需要一个一个column来设置。也可以使用TableLayout的 setShrinkAllColumns/setStretchAllColumns来设置all columns。 判断这些column是否shrinkable或stretchable,可以调用 isColumnShrinkable/isColumnStretchable(int columnIndex),isShrinkAllColumns()/isStretchAllColumns()。 <?xmlversion="1.0"encoding="utf-8"?> <TableLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:shrinkColumns="0">//设置第一个column可收缩 <TableRow> <TextView android:text="column1" android:padding="3dip"/> <TextView android:text="column2" android:padding="3dip"/> <TextView android:text="column3" android:padding="3dip"/> </TableRow> <TableRow> <TextView android:text="column11" android:visibility="invisible"/> <TextView android:text="左边的invisible" android:gravity="right" android:padding="3dip"/> <Button android:id="@+id/go2" android:text="go2" android:padding="3dip"/> <Button android:text="cancel" android:padding="3dip"/> </TableRow> <View android:layout_height="2dip" android:background="#F00"/> <TableRow> <TextView android:text="右边的cellempty"/> <TextView android:layout_column="2" android:text="跳开emptycell" android:padding="3dip"/> <TextView android:text="123456789" android:padding="3dip"/> </TableRow> </TableLayout> 可收缩column效果 现在可以看到第一个column为了让第4个column完整显示,而收缩得内容分为几行显示! 而 可伸展column的效果就是在其他column可以完整显示时,该column就会伸展,占最多空间: <?xmlversion="1.0"encoding="utf-8"?> <TableLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:stretchColumns="1">//设置第二个column可伸展 <TableRow> <TextView android:text="column1" android:padding="3dip"/> <TextView android:text="column2" android:gravity="right" android:padding="3dip"/> <TextView android:text="column3" android:padding="3dip"/> </TableRow> <TableRow> <TextView android:text="column1" android:padding="3dip"/> <TextView android:text="column2" android:gravity="right" android:padding="3dip"/> <TextView android:text="column3" android:padding="3dip"/> </TableRow> </TableLayout> 可伸展column效果 而动态隐藏column,可以调用TableLayout.setColumnCollapsed (int columnIndex, boolean isCollapsed)来指定相应的column。另外TableLayout类的boolean isColumnCollapsed (int columnIndex)能够判断指定的column是否隐藏。 TableLayout可以用来做网页上的Form显示效果,看看官方的sample: <?xmlversion="1.0"encoding="utf-8"?> <TableLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:stretchColumns="1"> <TableRow> <TextView android:text="@string/table_layout_10_user" android:textStyle="bold" android:gravity="right" android:padding="3dip"/> <EditTextandroid:id="@+id/username" android:text="@string/table_layout_10_username_text" android:padding="3dip" android:scrollHorizontally="true"/> </TableRow> <TableRow> <TextView android:text="@string/table_layout_10_password" android:textStyle="bold" android:gravity="right" android:padding="3dip"/> <EditTextandroid:id="@+id/password" android:text="@string/table_layout_10_password_text" android:password="true" android:padding="3dip" android:scrollHorizontally="true"/> </TableRow> <TableRow android:gravity="right"> <Buttonandroid:id="@+id/cancel" android:text="@string/table_layout_10_cancel"/> <Buttonandroid:id="@+id/login" android:text="@string/table_layout_10_login"/> </TableRow> </TableLayout> Form效果 本文转自 Icansoft 51CTO博客,原文链接:http://blog.51cto.com/android/314262

优秀的个人博客,低调大师

Android UI设计准则

导读:以下设计准则由Android用户体验团队秉承用户利益至上的原则开发。当你发挥自己的创造力和思考的时候,请将它们纳入考虑之中,并有意识地加以实践。 以意想不到的方式取悦我 一个漂亮的界面,一个悉心摆放的动画,或者一个适时的声音效果,都是一种快乐的体验。精细的效果能产生一种轻松的氛围,感觉手中有一股强大可控的力量。 真实对象比按钮和菜单更加有趣 允许人们直接触摸和操作你应用中的对象。它减少了执行一项任务所需的认识上的力量,并使之更加令人舒心。 让我把它变成我的 人们喜欢加入个人手势,因为这让他们感觉自在与可控。提供可感的、漂亮的默认手势,但同时又考虑好玩、可选又不影响主要任务的定制项。 学会了解我 随着时间的推移,学习用户的偏好。不要反复地问用户同样的问题,将用户先前的选择列出来以供快捷选择。 简化我的生活 用语简洁 使用由简单词汇构成的短句。人们更倾向于跳过过长的句子。 图像比文字更能直达理解考虑使用图像来解释观点。图像能捕获人们的注意力,往往比文字更有效率。 为我决定, 但最终由我说了算 做最好的猜测,先做而非先问。太多的选择和决定会令人不愉。只当你可能会犯错时,才提供个‘撤消’,然后仍然先做后问。 只在我需要的时候显示我所要的 当一下子看到太多东西时,人们容易受打击。将任务和信息分解成小的、可消化的片段。隐藏当前非必须的选项,并指导人们如何走下去。 我应该总能知道我在哪里 给人们以清楚自己在哪的信心。把你应用中的不同场景设计得可区分,并使用变换效果来显示不同场景(窗口)之间的关系。提供任务进度反馈。 决不能丢失我的东西 保存用户花时间创建的东西,使得他们能随处访问。跨手机、平板电脑及计算机等平台,记住设置、个人手势以及作品。这将使得软件升级成为世界上最简单的事。 如果看起来一样,所做的事就该一样 通过在视觉上加以区别,来帮助人们区分出功能的差异来。避免出现雷同场景,即看上去一样,但对于同一输入结果不同的场景。 只在十分重要时打断我 尤如一个好的个人助理,应该保护上司不被不重要的小事打扰。人们需要专注,除非情况十分严重并且紧急,打扰会是十分令人不悦的。 给我点处处可行的诀窍 人们如果能够自己探索出东西来,将会兴奋不已。通过使用可视的模式和习惯操作,使你的应用更加易于学习。比如,猛击操作会是一个很好的导航快捷手势。 这不是我的错 在提示用户改正错误时,应该礼貌。他们在用你应用的时候,需要被认为是聪明的。如果出错了,给出明确的恢复指令,而不是将技术细节留给他们。如果你可以在后台修复错误,那当然最好。 挥洒鼓励 将复杂的任务分解成小的容易被完成的步骤。对用户的操作给出反馈,即使只是一小步的成功。 为我担负重任 通过使他们做成他们认为自己不可能做到的事,让新手感觉自己像专家一样。比如,综合多个照片效果的快捷操作可使得外行简单几步做出惊人的照片效果来。 让重要的事情能更快地完成 并非所有的操作都是平等的。确定你应用中最重要的操作,使它能很容易地被发现与使用,比如相机上的快门,又如音乐播放器上的暂停按钮。 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/816854,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册