Android入门学习笔记(六):Android中的常见控件
来源:互联网 发布:mac 软件 卸载 编辑:程序博客网 时间:2024/05/24 06:21
Android入门学习笔记(六):Android中的常见控件
.常见控件概述
1. 到现在我所接触到的常见控件包括:
TextView、EditText、Button、Menu、RadioGroup和RadioButton、CheckBox、Toast、ProgressBar、ListView
2.一些常用的公共属性介绍
1) layout_width --宽
值:
fill_parent: 填充整个父控件,宽度和父元素相同
wrap_content: 宽度随本身的内容所调整,或者指定 px值来设置宽
2) layout_height --高
值:
fill_parent:填充整个父控件, 高度和父元素相同
wrap_content: 高度随本身的内容所调整,或者指定 px值来设置高
3) background --设置背景图
4) padding --设置边距
可以具体设置paddingBottom,paddingLeft,paddingRight,paddingTop来设定不同的px值
5) id -该object的id号
@+id/id1 代表添加新的id名为id1, @id/id1 代表引用id1的控件
6) layout_weight --权重
在视频学习中与自己网上参考的资料有冲突,但看到一个网友总结的很好
1. LinearLayout内部的子控件之间的layout_weight是按照正比例分配空间
2. LinearLayout之间的layout_weight是按照反比例分配空间
3. 在Horizontal的LinearLayout中,控件A和控件B的layout_weight分别设置为2和1,并不代表两者的宽度之比为2:1。 控件的宽度等于空间本身需要的宽度,加上通过layout_weight设置分配到了父空间里的宽度。垂直方向的LinearLayout也同理。
4.要想实现控件A和控件B的宽度严格按比例显示,可以每个控件之上都添加一个LinearLayout,在LinearLayout的属性里设置layout_weight.
7) layout_gravity-- Container组件的对齐方式
组件在layout里面的对齐方式,有如下常见取值:top、bottom、left、right等
8) gravity--文字在组件里的对齐方式
在Activity中,findViewByID方法可以通过控件ID来获得控件,然后就可以通过对应的函数来改变控件的各个属性值
.TextView
文本框,在前面的学习中就已经用到,用来显示文字内容的控件可以调用setText/getText方法来 设置/获得 文本内容
.EditText
文本编辑框,可以输入数据,同样可以调用setText/getText方法来 设置/获得 文本内容
.Button
按钮,一般给按钮注册一个事件监听器,这样就可以通过点击按钮的动作调用相应的事件如:上次笔记的例子中,通过点击button按钮达到跳转Activity的效果,代码如下:
package zhang.activity;import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class OneActivity extends Activity { /** Called when the activity is first created. */ private Button myButton = null; private TextView myTextView = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); myButton = (Button)findViewById(R.id.myButton); myTextView = (TextView)findViewById(R.id.myTextView); myButton.setOnClickListener(new MyButtonListener()); } class MyButtonListener implements OnClickListener{public void onClick(View v) {/*Intent intent = new Intent();intent.putExtra("hello",OneActivity.this.myTextView.getText());intent.setClass(OneActivity.this, OtherActivity.class);OneActivity.this.startActivity(intent);*/Uri uri = Uri.parse("smsto:10010");Intent intent = new Intent(Intent.ACTION_SENDTO,uri);intent.putExtra("sms_body", "This is the sms text");startActivity(intent);} }}给Button注册的是setOnClickListener监听器讲需要引发的动作写在对应的onClick方法中即可
.Menu
为Activity添加菜单Menu控件与其他控件有区别,使用Menu控件不需要在对应的布局文件中注册Menu控件,只需要重写onCreateOptionsMenu方法,然后在里面通过Menu的add方法添加相应的菜单项即可
如下例子:
package zhang.activity;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;public class Activity03 extends Activity { /** Called when the activity is first created. */private EditText edit1 = null;private EditText edit2 = null;private Button button = null;private TextView textView = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); edit1 = (EditText)findViewById(R.id.editText1); edit2 = (EditText)findViewById(R.id.editText2); button = (Button)findViewById(R.id.button); textView = (TextView)findViewById(R.id.textView); button.setText("计算"); button.setOnClickListener(new ButtonClicked()); } //当客户点击menu按钮时调用该方法 @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub //添加退出菜单项 menu.add(0, 1, 1, R.string.exit); menu.add(0,2,2,R.string.about); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub if(item.getItemId() == 1){ finish(); } else if(item.getItemId() == 2){ Toast.makeText(this, "this is the about_menu", Toast.LENGTH_LONG).show(); } return super.onOptionsItemSelected(item); } class ButtonClicked implements OnClickListener{public void onClick(View v) {// TODO Auto-generated method stubtextView.setText("= " + (Integer.parseInt(edit1.getText().toString()) * Integer.parseInt(edit2.getText().toString())));} } }
添加菜单项的方法为 MenuItem android.view.Menu.add(int groupId, int itemId, int order, int titleRes)
如menu.add(0, 1, 1, R.string.exit);第一个参数 int groupId 是菜单组是 0第二个参数 int itemId 是菜单项的ID是1,下面的onOptionsItemSelected 方法就是通过itemId来确定用户按的是哪个菜单按钮第三个参数 int order 是该菜单项摆放的位置,值为1表示排在第一位第四个参数 int titleRes 是该菜单项的标题
点击手机的Menu键即可启动菜单,显然这是个回调函数点击屏幕上的菜单项就会触动调用onOptionsItemSelected函数所以上面的实例点击手机的Menu按钮后会出现Menu菜单点击退出菜单程序就会结束点击关于就会出现下图
.RadioGroup和RadioButton
RadioGroup是RadioButton的组。一个RadioGroup里面可以有多个RadioButton,但是只能选中其中的一个RadioButton
通常将RadioGroup注册public voidsetOnCheckedChangeListener (RadioGroup.OnCheckedChangeListener listener) 监听器
然后在android.widget.RadioGroup.OnCheckedChangeListener接口中复写
public abstract voidonCheckedChanged (RadioGroup group, int checkedId) 方法,
参数 RadioGroup group 是被点击的RadioGroupint checkedId 是被选中的RadioButton的ID,可通过getId方法获得
.CheckBox
CheckBox继承自CompoundButton,是有双状态按钮的复选框,可以选中也可 以不选中每个CheckBox可注册 public void setOnCheckedChangeListener (RadioGroup.OnCheckedChangeListener listener) 监听器然后在android.widget.CompoundButton.OnCheckedChangeListener接口中复写public abstract void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 方法,参数 CompoundButton buttonView 是被点击的CheckBox按钮(因为CheckBox类是CompoundButton的子类)参数 boolean isChecked 指明被点击按钮是否为选中状态
.Toast
用于弹出提示信息,之前的例子就已经用到过,非常的简单方便如Toast.makeText(RadioTest.this, text, Toast.LENGTH_LONG).show();就是在本Activity上弹出显示字符串text的内容,显示时间较长
.一个包含了RadioGroup、RadioButton、CheckBox和Toast的例子
package com.android.zhang;import java.util.ArrayList;import android.app.Activity;import android.os.Bundle;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.RadioButton;import android.widget.RadioGroup;import android.widget.Toast;import android.widget.RadioGroup.OnCheckedChangeListener;import android.widget.TextView;public class RadioTest extends Activity {private ArrayList<String> sportList = new ArrayList<String>();private TextView textView;private RadioGroup genderGroup;private RadioButton maleButton;private RadioButton femaleButton;private CheckBox run;private CheckBox swim;private CheckBox read;private String gender = ""; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView = (TextView)findViewById(R.id.textView); genderGroup = (RadioGroup)findViewById(R.id.genderGroup); maleButton = (RadioButton)findViewById(R.id.maleButton); femaleButton = (RadioButton)findViewById(R.id.femaleButton); run = (CheckBox)findViewById(R.id.run); swim = (CheckBox)findViewById(R.id.swim); read = (CheckBox)findViewById(R.id.read); run.setOnCheckedChangeListener(new OnChecked()); swim.setOnCheckedChangeListener(new OnChecked()); read.setOnCheckedChangeListener(new OnChecked()); genderGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {public void onCheckedChanged(RadioGroup group, int checkedId) {// TODO Auto-generated method stubif(femaleButton.getId() == checkedId){gender = "female";}else if(maleButton.getId() == checkedId){gender = "male";}}}); } class OnChecked implements CompoundButton.OnCheckedChangeListener{ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub String str = ""; if(buttonView == run){ str = "run"; } else if(buttonView == swim){ str = "swim"; } else if(buttonView == read){ str = "read"; } if(isChecked){ if(!sportList.contains(str)){ sportList.add(str); } } else if(!isChecked){ if(sportList.contains(str)){ sportList.remove(str); } } String text ="gender: " + gender + " sport: "; for(String s : sportList){ text += s + " "; } textView.setText(text); Toast.makeText(RadioTest.this, text, Toast.LENGTH_LONG).show(); } }}对应布局文件:<?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" ><TextView android:id="@+id/textView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /><RadioGroupandroid:id="@+id/genderGroup"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"><RadioButtonandroid:id="@+id/maleButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/male"/><RadioButtonandroid:id="@+id/femaleButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/famale"/></RadioGroup><CheckBoxandroid:id="@+id/run"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/run"/><CheckBoxandroid:id="@+id/swim"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/swim"/><CheckBoxandroid:id="@+id/read"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/read"/></LinearLayout>程序运行情况如下
.ProgressBar
ProgressBar为进度条
重要属性
android:progressBarStyle:默认进度条样式
android:progressBarStyleHorizontal:水平样式
重要方法
getMax():返回这个进度条的范围的上限
getProgress():返回进度
setProgress():设置进度条位置
getSecondaryProgress():返回次要进度
setSecondaryProgress():设置次要进度条位置
incrementProgressBy(int diff):指定增加的进度
isIndeterminate():指示进度条是否在不确定模式下
setIndeterminate(boolean indeterminate):设置不确定模式下
setVisibility(int v):设置该进度条是否可视
重要事件
onSizeChanged(int w, int h, int oldw, int oldh):当进度值改变时引发此事件
实例:
main.xmlpackage com.android.progressbar;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ProgressBar;public class ProgressBarActivity extends Activity {private ProgressBar firstBar;private ProgressBar secondBar;private Button button;private int i = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); firstBar = (ProgressBar)findViewById(R.id.firstBar); secondBar = (ProgressBar)findViewById(R.id.secondBar); button = (Button)findViewById(R.id.button); firstBar.setMax(200); button.setOnClickListener(new OnClickListener() {public void onClick(View v) {// TODO Auto-generated method stubif( i == 0){firstBar.setVisibility(View.VISIBLE);secondBar.setVisibility(View.VISIBLE);}else if( i < firstBar.getMax()){firstBar.setProgress(i);firstBar.setSecondaryProgress(i+10);secondBar.setProgress(i);}else{firstBar.setVisibility(View.GONE);secondBar.setVisibility(View.GONE);}i += 10;}}); }}
main.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" ><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /><ProgressBarandroid:id="@+id/firstBar"style="?android:attr/progressBarStyleHorizontal"android:layout_width="200dp"android:layout_height="wrap_content"android:visibility="gone"/><ProgressBarandroid:id="@+id/secondBar"style="?android:attr/progressBarStyle"android:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="gone"/><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="start"/></LinearLayout>
在main.xml 中注册了一个默认的progressBarStyleHorizontal类型的firstBar和一个progressBarStyle类型的secondBar,并注册了一个Button按钮
在Activity中设置了firstBar的最大值:firstBar.setMax(200);android.view.View.OnClickListener接口的onClick方法中
第一次点击会将两个进度条显示以后没点一次按钮,i值加10次要进度总是比第一进度大10
.ListView
ListView比之前的控件用起来要复杂些,但自己编写实例后就大大加深了对其理解下面是摘自网友http://myzh.me/blog/2011/03/android%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B9%8B%E5%B8%B8%E7%94%A8%E6%8E%A7%E4%BB%B6%EF%BC%88%E4%B8%89%EF%BC%89%E8%BF%9B%E5%BA%A6%E6%9D%A1%E3%80%81listview/关于ListView的总结,写得非常好:
Listview是一种卷帘示列表项显示视图,其中的列表项来自于关联在当前视图上的Listadapter适配器对象。
① 使用listview的类需要继承ListActivity来代替继承Activity。
② 为当前Activity创建xml布局文件,并绑定。
③ 为列表象创建xml布局文件。
④ 实例化一个列表队列,中间用hashmap类型来存放数据。
⑤ 实例化listadapter适配器对象,并绑定。
下面是我的实例:
package com.android.listView;import java.util.ArrayList;import java.util.HashMap;import android.app.ListActivity;import android.os.Bundle;import android.view.View;import android.widget.ListView;import android.widget.SimpleAdapter;public class ListViewActivity extends ListActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>(); HashMap<String,String> map1 = new HashMap<String, String>(); HashMap<String,String> map2 = new HashMap<String, String>(); HashMap<String,String> map3 = new HashMap<String, String>(); map1.put("user_name", "zhangsan"); map1.put("user_ip", "192.168.0.1"); map1.put("position","0"); map2.put("user_name", "lisi"); map2.put("user_ip", "192.168.0.2"); map2.put("position","1"); map3.put("user_name", "wangwu"); map3.put("user_ip", "192.168.0.3"); map3.put("position", "2"); list.add(map1); list.add(map2); list.add(map3); SimpleAdapter listAdapter = new SimpleAdapter(this,list,R.layout.user,new String[]{"user_name","user_ip","position"},new int[]{R.id.user_name,R.id.user_ip,R.id.position}); setListAdapter(listAdapter); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { // TODO Auto-generated method stub super.onListItemClick(l, v, position, id); System.out.println("id-----------" + id); System.out.println("position=========" + position); }}
main.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"><!--<LinearLayoutandroid:id="@+id/listLinearLayout"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical">--><ListViewandroid:id="@id/android:list"android:layout_width="fill_parent"android:layout_height="wrap_content"android:drawSelectorOnTop="false"android:scrollbars="vertical"/><!-- </LinearLayout>--></LinearLayout>user.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:paddingLeft="10dip" android:paddingRight="10dip" android:paddingTop="1dip" android:paddingBottom="1dip" > <TextView android:id="@+id/user_name"android:layout_width="130dip"android:layout_height="30dip"android:textSize="10pt"android:singleLine="true"/> <TextView android:id="@+id/user_ip" android:layout_width="wrap_content" android:layout_height="fill_parent" android:gravity="right" android:textSize="10pt" /> <TextView android:id="@+id/position" android:layout_width="50dip" android:layout_height="fill_parent" android:textSize="10pt" android:gravity="right" /> </LinearLayout>
首先,ListView继承的是Activity的子类ListActicity
为该Activity建立了简单的main.xml布局文件
定义了一个HashMap<String,String>类型的ArrayList
并定义了三个HashMap<String,String>,都含有相同的三个键值user_name、user_ip、position
讲三个HashMap<String,String>添加到ArrayList中
重要方法
SimpleAdapter的构造方法
android.widget.SimpleAdapter.SimpleAdapter(Context context,List<? extends Map<String, ?>> data, int resource,String[] from, int[] to)
第一个参数是该Activity
第二个参数指定对应的ArrayList
第三个参数指定为列表创建的布局文件user.xml
第四个参数指定列表每一列的名字
第五个参数指定每一列在布局文件中的ID
程序执行的截图如下:
点击列表中的项后,在DDMS模式下可以看到如下输出:
所以,ListView控件,可以调用
protected void onListItemClick(ListView l,View v, int position, long id)
方法通过点击的项目的id或者position来触发相应事件
.心得
今天一开始eclipse打开Android模拟器总提示有如下错误:ERROR: the user data image is used by another emulator. abortinggoogle下后发现是如下问题:
问题原因:avd的加锁机制使然。 .lock是加锁,如果程序崩溃或者不是正常退出等原因导致无法清除这些以.lock结尾的文件夹,就会出现这个问题,也就是这个avd的锁没有被释放,导致avd manager以为这个avd正在使用当中。他会默认锁定该模拟器还是在运行,资源被占有了。
解决:
1。winXP:
C/Documents and Settings / 用户 / .android /的AVD / *设备* / (比如我的目录是:C:\Documents and Settings\Administrator\.android\avd\android2.0.avd)
然后删去以.lock结尾的文件夹就行(我简单解释下为什么要删除这些文件呢,其实.lock是加锁,如果程序崩溃等原因导致无法清除这些以.lock结尾的文件夹,就会出现这个问题,也就是这个avd的锁没有被释放,导致avd manager以为这个avd正在使用当中。)
2/。win7:
C/用户/user/.android/avd/找到该目录下与模拟器对应的avd,然后删除其中的.lock文件即可。按上面的方法很快把问题解决
最近在写笔记的过程中也看了不少前辈的优秀笔记,我是一个纯初学者,且第一次写学习笔记。
发现在观看他人的笔记中,可以学到不少知识,同时我也借鉴了某些网友的优秀总结。
过几天就回家了,这几天多学点东西
- Android入门学习笔记(六):Android中的常见控件
- android入门:zxing学习笔记(六)
- android入门:zxing学习笔记(六)
- Android入门学习笔记整理(六)
- Android学习笔记9:常见控件(2)
- Android学习笔记·常见控件TextView
- 《第一行代码》学习笔记--Android入门(五、六)
- Android学习笔记(六)
- android学习笔记(六)
- Android学习笔记(六)
- Android学习笔记(六)
- Android入门学习:GUI中的常用控件
- Android 学习笔记(六)
- android 开发零起步学习笔记(六)Android 自定义控件开发
- Android学习笔记(二六):输入法
- android学习笔记(六) intent
- Android学习笔记(六)SQLite
- Android学习笔记(二六):输入法
- 【转】VB问题:如何读取、返回某一目录下的所有文件名
- linux 下mysql起动的全过程
- skyeye 配置
- 鸟笼逻辑
- 【转】tomcat6.0配置
- Android入门学习笔记(六):Android中的常见控件
- 破窗效应
- Linux下的进程间通信(ipc)
- 面试技巧:16个经典面试问题回答思路
- 光鲜靓丽背后的无奈 苦逼游戏人大吐苦水
- android权限大全
- C++变量名放哪了
- 关于HashTable,HashMap和TreeMap的几点心得
- 【转】SQL2000存储过程的基础