首页 文章 精选 留言 我的

精选列表

搜索[ui automator],共10002篇文章
优秀的个人博客,低调大师

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,如需转载请自行联系原作者

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

UI组件-实用组件

前言 我们听过无数的道理,却仍旧过不好这一生。 Toast组件 Toast是一种非常方便的提示消息框,它会在程序界面上显示一个简单的提示信息。它具有如下两个特点。 Toast提示信息不会获得焦点。 Toast提示信息过一段时间会自动消失。 使用Toast来生成提示消息也非常简单,只要如下几个步骤。 调用Toast的构造器或makeText()静态方法创建一个Toast对象。 调用Toast的方法来设置该消息的对齐方式、页边距等。 调用Toast的show()方法将它显示出来。 除此之外,Toast不仅可以显示文本,还可以显示图片、列表之类的复杂提示。 代码示例 toast.xml <?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" android:gravity="center_horizontal" > <Button android:id="@+id/bt1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="显示简单提示" /> <Button android:id="@+id/bt2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="显示图片提示" /> </LinearLayout> MainActivity.java public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.toast); Button simple = (Button) findViewById(R.id.bt1); //为按钮的单击事件绑定事件监听器 simple.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //创建一个Toast提示消息 //设置该Toast提示信息的持续时间 Toast toast = Toast.makeText(MainActivity.this, "简单的提示信息", Toast.LENGTH_SHORT); toast.show(); } }); Button imageBt = (Button) findViewById(R.id.bt2); imageBt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //创建一个Toast提示信息 Toast toast = new Toast(MainActivity.this); //设置Toast的显示位置 toast.setGravity(Gravity.CENTER, 0, 0); //创建一个ImageView ImageView image = new ImageView(MainActivity.this); image.setImageResource(R.drawable.ic_launcher); //创建一个LinearLayout容器 LinearLayout ll = new LinearLayout(MainActivity.this); //向LinearLayout中添加图片、原有的View ll.addView(image); //创建一个TextView TextView textView = new TextView(MainActivity.this); textView.setText("带图片的提示信息"); textView.setTextSize(24); textView.setTextColor(Color.BLUE); ll.addView(textView); //设置Toast显示自定义View toast.setView(ll); //设置Toast的显示时间、 toast.setDuration(Toast.LENGTH_LONG); toast.show(); } }); } } 效果 Screenshot_20171023-104940.png 提示 建议使用对话框来完成图片提示及其列表显示之类的复杂提示 CalendarView组件 日历视图(CalendarView)用于显示和选择日期,用户既可以选择日期,也可通过触摸来滚动日历。 代码示例 calendarview.xml <?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" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="选择您的生日:" /> <!-- 设置以星期二作为每周的第一天,设置该组件总共显示4个星期,并对该组件的日期时间进行了定制 --> <CalendarView android:id="@+id/calendarView" android:layout_width="match_parent" android:layout_height="match_parent" android:firstDayOfWeek="3" android:shownWeekCount="4" android:focusedMonthDateColor="#f9f" android:weekSeparatorLineColor="#ff0" android:unfocusedMonthDateColor="#f00" /> </LinearLayout> public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.calendarview); CalendarView cv = (CalendarView) findViewById(R.id.calendarView); cv.setOnDateChangeListener(new OnDateChangeListener() { @Override public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) { //使用Toast显示用户选择的日期 Toast.makeText(MainActivity.this, "您的生日是" + year + "年" + month + "月" + dayOfMonth + "日", Toast.LENGTH_SHORT).show(); } }); } } MainActivity.java 效果 Screenshot_20171023-111302.png 提示 android:dataTextAppearance属性,设置该日历视图的日期文字的样式。 android:firstDayOfWeek属性,设置每周的第一天。 android:showWeekNumber属性,设置是否显示第几周。 android:设置该日历组件总共显示几个星期。 DatePicker和TimePicker组件 日期、时间选择器是两个简单的组件,由FrameLayout派生而来,其中DatePicker供用户选择日期;TimePicker供用户选择时间。 代码示例 picker.xml <?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" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="选择购买本书的具体时间" /> <DatePicker android:id="@+id/datePicker" android:layout_width="wrap_content" android:layout_height="200dp" android:layout_gravity="center_horizontal" android:startYear="2000" android:endYear="2018" android:calendarViewShown="true" android:spinnersShown="true" /> <TimePicker android:id="@+id/timePicker" android:layout_width="wrap_content" android:layout_height="100dp" android:layout_gravity="center_horizontal" /> <EditText android:id="@+id/show" android:layout_width="match_parent" android:layout_height="wrap_content" android:editable="false" android:cursorVisible="false" /> </LinearLayout> public class MainActivity extends Activity { private int year; private int month; private int day; private int hour; private int minute; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.picker); DatePicker datePicker = (DatePicker) findViewById(R.id.datePicker); TimePicker timePicker = (TimePicker) findViewById(R.id.timePicker); //获取当年的年、月、日、小时、分钟 Calendar c = Calendar.getInstance(); year = c.get(Calendar.YEAR); month = c.get(Calendar.MONTH); day = c.get(Calendar.DAY_OF_MONTH); hour = c.get(Calendar.HOUR); minute = c.get(Calendar.MINUTE); //初始化DatePicker组件,初始化指定监听器 datePicker.init(year, month, day, new OnDateChangedListener() { @Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { MainActivity.this.year = year; MainActivity.this.month = monthOfYear; MainActivity.this.day =dayOfMonth; //显示当前日期、时间、 showDate(year, month, day, hour, minute); } }); //为TimePicker指定监听器 timePicker.setOnTimeChangedListener(new OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { MainActivity.this.hour = hourOfDay; MainActivity.this.minute = minute; //显示当前日期、时间、 showDate(year, month, day, hour, minute); } }); } //定义在EditText中显示当前日期、时间的方法 private void showDate(int year, int month, int day, int hour, int minute) { EditText show = (EditText) findViewById(R.id.show); show.setText("您的购买日期为:" + year + "年" + (month + 1) + "月" + day + "日" + hour + "时" + minute +"分"); } } MainActivity.java 效果 Screenshot_20171023-124453.png 提示 android:calendarViewShown属性,设置该日期选择器是否显示CalendarView组件。 android:endYear属性,设置日期选择器允许选择的最后一年。 android:startYear属性,设置日期选择器允许选择的第一年。 android:spinnersShown属性,设置该日期选择器是否显示Spinner日期选择组件。 NumberPicker组件 数值选择器用于让用户输入数值,用户既可以通过键盘输入数值,也可以通过拖动来选择数值。使用该组件常用的方法如下。 setMinValue(int minVal):设置该组件支持的最小值。 setMaxValue(int maxVal):设置该组件支持的最大值。 setValue(int value):设置该组件的当前值。 代码示例 numberpicker.xml <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <TableRow android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:text="选择低价:" android:layout_width="120dp" android:layout_height="wrap_content" /> <NumberPicker android:id="@+id/np1" android:layout_width="match_parent" android:layout_height="80dp" android:focusable="true" android:focusableInTouchMode="true" /> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:text="选择高价:" android:layout_width="120dp" android:layout_height="wrap_content" /> <NumberPicker android:id="@+id/np2" android:layout_width="match_parent" android:layout_height="80dp" android:focusable="true" android:focusableInTouchMode="true" /> </TableRow> </TableLayout> MainActivity.java public class MainActivity extends Activity { NumberPicker np1,np2; //定义最低价格、最高价格的初始值 int minPrice = 25, maxPrice = 75; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.numberpicker); np1 = (NumberPicker) findViewById(R.id.np1); //设置np1的最大值和最小值 np1.setMinValue(10); np1.setMaxValue(50); //设置np1的当前值 np1.setValue(minPrice); np1.setOnValueChangedListener(new OnValueChangeListener() { //当NumberPicker的值发生改变时,将会激发该方法 @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { minPrice = newVal; showSelectedPrice(); } }); np2 = (NumberPicker) findViewById(R.id.np2); //设置np2的最小值和最大值 np2.setMinValue(60); np2.setMaxValue(100); //设置np2的当前值 np2.setValue(maxPrice); np2.setOnValueChangedListener(new OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { maxPrice = newVal; showSelectedPrice(); } }); } private void showSelectedPrice() { Toast.makeText(this, "您选择最低价格为: " + minPrice + ",最高价格为: " + maxPrice, Toast.LENGTH_SHORT).show(); } } 效果 Screenshot_20171023-131415.png SearchView组件 SearchView是搜索框组件,它可以让用户在文本框内输入文字,并允许通过监听器监控用户输入,当用户输入完成后提交搜索时,也可以通过监听器执行实际的搜索。使用SearchView时可使用如下常用的方法。 setIconifiedByDefault(boolean iconified):设置该搜索框默认是否自动缩小为图标。 setSubmitButtonEnabled(boolean enable):设置是否显示搜索按钮。 setQueryHint(CharSequence hint):设置搜索框内默认显示的提示文本。 setOnQueryTextListener(SearchView.OnQueryTextListener listener):为该搜索设置监听事件。 如果为SearchView增加一个配套的ListView,则可以为SearchView增加自动完成的功能。 代码示例 searchview.xml <?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" > <SearchView android:id="@+id/sv" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout> MainActivity.java public class MainActivity extends Activity { private SearchView sv; private ListView lv; // 自动完成的列表 private final String[] mString = { "aaaaa", "bbbbbb", "cccccc" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.searchview); lv = (ListView) findViewById(R.id.lv); lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mString)); //设置ListView启用过滤器 lv.setTextFilterEnabled(true); sv = (SearchView) findViewById(R.id.sv); //设置该SearchView默认是否自动缩小为图标 sv.setIconifiedByDefault(true); //设置该SearchView显示搜索按钮 sv.setSubmitButtonEnabled(true); //设置该SearchView内默认显示的提示文本 sv.setQueryHint("查找"); //为该组件设置监听器 sv.setOnQueryTextListener(new OnQueryTextListener() { //单击搜索按钮时激发该方法 @Override public boolean onQueryTextSubmit(String query) { //实际应用中应该在该方法中执行查询 Toast.makeText(MainActivity.this, "您的选择是:" + query, Toast.LENGTH_SHORT).show(); return false; } //用户输入字符时激活该方法 @Override public boolean onQueryTextChange(String newText) { //如果newText不是长度为0的字符串 if(TextUtils.isEmpty(newText)) { //清楚ListView的过滤 lv.clearTextFilter(); } else { //使用用户输入的内容对ListView的列表项进行过滤 lv.setFilterText(newText); } return true; } }); } } 效果 Screenshot_20171023-134249.png TabHost组件 选项卡(TabHost)是一种非常实用的组件,TabHost可以很方便地在窗口上放置多个标签页,每个标签页相当于获得了一个与外部容器相同大小的组件摆放区域。通过这种方式,就可以在一个容器里放置更多的组件,例如手机系统都会在同一个窗口中定义多个标签页来显示通话记录。 使用TabHost的一般步骤如下。 在界面布局文件中定义TabHost组件,并为该组件定义该选项卡的内容。 Activity应该继承TabActivity。 调用TabActivity的getTabHost()方法获取TabHost对象。 通过TabHost对象的方法来创建、添加选项卡。 代码示例 tabhost.xml <?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- 定义第一个标签页内容 --> <LinearLayout android:id="@+id/tab01" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="已拨电话" /> </LinearLayout> <!-- 定义第二个标签页内容 --> <LinearLayout android:id="@+id/tab02" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="未接电话" /> </LinearLayout> <!-- 定义第三个标签内容 --> <LinearLayout android:id="@+id/tab03" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="语音信箱" /> </LinearLayout> </FrameLayout> </LinearLayout> </TabHost> MainActivity.java public class MainActivity extends TabActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tabhost); // 获取该Activity里面的TabHost组件 TabHost tabHost = getTabHost(); // 创建第一个Tab界面 TabSpec tab1 = tabHost.newTabSpec("tab1").setIndicator("已接电话")// 设置标题 .setContent(R.id.tab01);// 设置内容 // 添加第一个标签页 tabHost.addTab(tab1); TabSpec tab2 = tabHost.newTabSpec("tab2").setIndicator("未接电话")// 设置标题 .setContent(R.id.tab02);// 设置内容 // 添加第二个标签页 tabHost.addTab(tab2); TabSpec tab3 = tabHost.newTabSpec("tab3").setIndicator("语音信箱")// 设置标题 .setContent(R.id.tab03);// 设置内容 // 添加第三个标签页 tabHost.addTab(tab3); } } 效果 Screenshot_20171023-141612.png 提示 最新版本的Anroid平台已经不再推荐使用TabActivity,而是推荐使用Fragement来代替TabActivity。 ScrollView和HorizontalScrollView组件 ScrollView由FrameLayout派生而出,它就是一个用于为普通组件添加滚动条的组件。ScrollView的作用是为该组件添加垂直滚动条,HorizontalScrollView的作用是为该组件添加水平滚动条。 代码示例 <?xml version="1.0" encoding="utf-8"?> <!-- 定义ScrollView,为里面的组件添加垂直滚动条 --> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- 定义HorizontalScrollView,为里面的组件添加水平滚动条 --> <HorizontalScrollView android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > ....若干个TextView </LinearLayout> </HorizontalScrollView> </ScrollView> 效果 Screenshot_20171023-143018.png Notification组件 Notification是显示在手机状态栏的通知——手机状态栏位于手机屏幕的最上方,它是一种具有全局效果的通知。程序一般通过NotificationManager服务来发送Notification。 代码示例 notification.xml <?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" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发送" android:onClick="send" android:layout_gravity="center_horizontal" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="取消" android:onClick="cancel" android:layout_gravity="center_horizontal" /> </LinearLayout> MainActivity.java public class MainActivity extends Activity { static final int NOTIFICATION_ID = 0x123; NotificationManager nm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.notification); //获取系统的NotificationManager服务 nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); } public void send(View v) { //创建一个启动其他Activity的Intent Intent intent = new Intent(MainActivity.this,OtherActivity.class); PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0); Notification notify = new Notification.Builder(this) //设置打开该通知,该通知自动取消 .setAutoCancel(true) //设置显示在状态栏的通知提示信息 .setTicker("有新消息") //设置通知内容的图标 .setSmallIcon(R.drawable.ic_launcher) //设置通知内容的标题、 .setContentTitle("一条新通知") //设置通知内容 .setContentText("你好,halo") //设置使用系统默认的声音、默认LED灯 .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS) //设置通知将要启动的Intent .setContentIntent(pi).build(); //发送通知 nm.notify(NOTIFICATION_ID, notify); } public void cancel(View v) { nm.cancel(NOTIFICATION_ID); } } 效果 Screenshot_20171023-150114.png 提示 这个应用程序的功能是点击发送按钮收到消息通知,然后点击通知将会跳转到另一个Activity。因为上面的程序需要访问系统的闪关灯、振动器,还需要在AndroidManifest.xml文件中声明权限。

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

iphone UI 开发教程

UIControl IOS控件编程—IOS开发 有关View的几个基础知识点-IOS开发 UIKeyboard键盘相关知识点-IOS开发 UISegmentedControl 分段控件-IOS开发 UISlider 滑块控件—IOS开发 UISwitch 开关控件—IOS开发 打开键盘遮住View的问题解决方法-IOS开发 UITextField 文本字段控件-IOS开发 UIWebView网页视图—IOS开发 操纵状态栏-IOS开发 UIActionSheet操作表单-IOS开发 UIAlertView警报-IOS开发 应用程序徽章-IOS开发 在程序中调用Safari和发起电话呼叫-IOS开发 IOS开发UIButton 按钮控件 IOS开发-UIPageControl 分页控件 IOS开发-UIActivityIndicatorView、UIProgressView 活动与进度指示器 IOS开发--UIImage 图像 本文转自qianqianlianmeng博客园博客,原文链接:http://www.cnblogs.com/aimeng/archive/2012/03/02/2377300.html ,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

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部分的功能。

用户登录
用户注册