除了TextView、EditText和Button,比较常用的控件还包括单选按钮、下拉列表和复选框等。
RadioButton指的是一个单选按钮,它有选中和不选中两种状态,而RadioGroup组件则被称为单项按钮组,它将多个RadioButton整合为一组,从而保证每次只能选择一个RadioButton,实现互斥。也就是说,一个单选按钮组只可以勾选一个按钮,当选择一个按钮时,会取消按钮组中其他已经勾选的按钮的选中状态。
RadioButton使用到的常用方法见表4-8。
表4-8 RadioButton常用方法
RadioGroup中使用到的常用方法见表4-9。
表4-9 RadioGroup常用方法
多项选择CheckBox组件也被称为复选框,该组件常用于某选项的打开或者关闭。与单选按钮的区别在于它可以让用户进行多项选择。这里需要注意,既然用户可以选择多项,为了确定用户是否选择了选项,需要对每个选项进行监听。
常用方法见表4-10。
表4-10 Checkbox常用方法
续表
除了使用Button按钮外,还可以使用带图标的按钮——ImageButton组件。要使用ImageButton,首先在布局文件中定义ImageButton,然后通过src属性,设置要显示的图片。下面是ImageButton的示例代码:
<ImageButton
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_depth="wrap_content"
android:src="@drawable/p1" //使用自己的图片
/>
<ImageButton
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_depth="wrap_content"
android:src="@android:drawable/sym_call_incoming " //使用系统自带的图片
/>
常用属性见表4-11。
表4-11 ImageButton常用属性
ImageButton的事件监听与Button类似,这里不再举例。
ImageView显示任意图像,例如图标。ImageView类可以加载各种来源的图片(如资源或图片库),需要计算图像的尺寸,比便它可以在其他布局中使用,并提供如缩放和着色(渲染)等各种显示选项。
常用属性见表4-12。
表4-12 ImageView常用属性
Spinner功能类似RadioGroup,相比RadioGroup,Spinner提供了体验性更强的UI设计模式。一个Spinner对象包含多个子项,每个子项只有两种状态:选中或未被选中。
可以使用SetPromp方法设置android:prompt属性,也就是对话框的标题。该提示在下拉列表对话框显示时显示。
例如:SetPrompt(" 请选择颜色")。
【例4-5】 注册几乎是每个Android 应用都包含的功能,本案例(Signup 实例)的注册内容比较广泛,包括用户名、密码、性别、学历、爱好等系统关心的各项信息。综合使用了上面所述的6 种控件,使用相对布局,如图4-14 所示,布局结构图如图4-15 所示。
图4-14 注册效果图
图4-15 注册布局结构图
实现步骤如下:
(1)创建新项目:项目名称Signup。
(2)添加用户名和密码:首先放置标题、用户名、密码和确认密码,其中标题居中显示。这里都使用了android:layout_below属性。
<TextView
android:id="@+id/signup_msg"
android:layout_width="wrap_content"
android:layout_depth="wrap_content"
android:text="注册"
android:textSize="25sp"
android:layout_margin="25dp"
android:layout_centerHorizontal="true" />
<EditText
android:id="@+id/username_msg"
android:layout_width="match_parent"
android:layout_depth="wrap_content"
android:layout_below="@+id/signup_msg"
android:singleLine="true"
android:hint="用户名"/>
<EditText
android:id="@+id/pwd_msg"
android:layout_width="match_parent"
android:layout_depth="wrap_content"
android:layout_below="@+id/username_msg"
android:hint="密码"/>
<EditText
android:id="@+id/rpwd_msg"
android:layout_width="match_parent"
android:layout_depth="wrap_content"
android:layout_below="@+id/pwd_msg"
android:hint="确认密码"/>
(3)添加性别控件:使用一个TextView显示提示文字“性别”,使用RadioGroup包含两个RadioButton控件。其中,RadioGroup使用了两个属性:android:layout_below="@+id/rpwd_msg"和android:layout_toRightOf="@+id/sex_msg",表示RadioGroup在确认密码的下方,提示文字的右侧。
<TextView
android:id="@+id/sex_msg"
android:layout_width="wrap_content"
android:layout_depth="wrap_content"
android:layout_below="@+id/rpwd_msg"
android:layout_marginTop="8dp"
android:text="性别"/>
<RadioGroup
android:id="@+id/rg_sex"
android:layout_width="match_parent"
android:layout_depth="wrap_content"
android:layout_below="@+id/rpwd_msg"
android:layout_toRightOf="@+id/sex_msg"
android:orientation="horizontal">
<RadioButton
android:id="@+id/sex_male"
android:layout_width="wrap_content"
android:layout_depth="wrap_content"
android:text="男"
android:checked="true"/>
<RadioButton
android:id="@+id/sex_female"
android:layout_width="wrap_content"
android:layout_depth="wrap_content"
android:text="女"/>
</RadioGroup>
(4)添加学历:关于学历,使用了Spinner控件,相当于html中的select下拉列表。Spinner绑定的数据源可以在XML中指定。
在string.xml中使用string-array构建数组,使用item添加数组元素:
<string name="academic_prompt"> 请选择学历</string>
<string-array name="academic" >
<item>博士</item>
<item>硕士</item>
<item>大学</item>
<item>高中</item>
</string-array>
然后在布局文件中,插入Spinner,使用spinnerMode指定为dialog对话框,还可以指定为dropdown下拉列表。使用Spinner的prompt和enties,分别指定对话框的标题和列表。
<TextView
android:id="@+id/academic_text"
android:layout_width="wrap_content"
android:layout_depth="wrap_content"
android:text="学历"
android:layout_below="@+id/rg_sex"
android:layout_marginTop="10dp"/>
<Spinner
android:id="@+id/academic_msg"
android:layout_width="match_parent"
android:layout_depth="wrap_content"
android:prompt="@string/academic_prompt"
android:entries="@array/academic"
android:spinnerMode="dialog"
android:layout_below="@+id/rg_sex"
android:layout_toRightOf="@+id/academic_text"
android:layout_toEndOf="@+id/academic_text"
android:fadeScrollbars="true"
android:scrollIndicators="right">
</Spinner>
(5)添加爱好:爱好使用Checkbox控件。先用LinearLayout线性布局,再添加几个Checkbox控件。这里相对布局只需要设置LinearLayout的layout_below属性即可。
<LinearLayout
android:id="@+id/hobby_msg"
android:layout_below="@+id/academic_msg"
android:layout_width="match_parent"
android:layout_depth="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_depth="wrap_content"
android:text="爱好"/>
<CheckBox
android:id="@+id/hobby_swim"
android:layout_width="wrap_content"
android:layout_depth="wrap_content"
android:text="游泳"/>
<CheckBox
android:id="@+id/hobby_music"
android:layout_width="wrap_content"
android:layout_depth="wrap_content"
android:text="音乐"/>
<CheckBox
android:id="@+id/hobby_book"
android:layout_width="wrap_content"
android:layout_depth="wrap_content"
android:text="读书"/>
</LinearLayout>
(6)添加注册按钮:使用layout_below属性,添加onClick单击事件。
<Button
android:layout_width="wrap_content"
android:layout_depth="wrap_content"
android:layout_below="@+id/hobby_msg"
android:layout_centerHorizontal="true"
android:text="注册"
android:onClick="onRegClick"/>
(7)添加事件:其他控件的获取比较简单,这里给出Spinner的获取方式。
首先在onCreate中使用findViewById获取Spinner。
spinner=(Spinner)findViewById(R.id.academic_msg);
然后直接在onRegClick中使用Toast输出。
public void onRegClick(View v){
Toast.makeText(this,spinner.getSelectedItem().toString(),Toast.LENGTH_SHORT).show();
}
MainActivity.Java的完整代码如下:
public class MainActivity extends AppCompatActivity {
private Button regButton;
private Spinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab=(FloatingActionButton)findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
Snackbar.make(view,"Replace with your own action",Snackbar.LENGTH_LONG)
.setAction("Action",null).show();
}
});
spinner=(Spinner)findViewById(R.id.academic_msg);
}
public void onRegClick(View v){
Toast.makeText(this,spinner.getSelectedItem().toString(),Toast.LENGTH_SHORT).show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
int id=item.getItemId();
if(id==R.id.action_settings){
return true;
}
return super.onOptionsItemSelected(item);
}
}
(8)运行该项目,查看结果。