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 是被点击的RadioGroup
         int  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.xml

package 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. aborting  
google下后发现是如下问题:
 问题原因: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文件即可。


按上面的方法很快把问题解决

最近在写笔记的过程中也看了不少前辈的优秀笔记,我是一个纯初学者,且第一次写学习笔记。

发现在观看他人的笔记中,可以学到不少知识,同时我也借鉴了某些网友的优秀总结。

过几天就回家了,这几天多学点东西奋斗