1.在res/layout目录下编写main.xml布局文件
2.在mainActivity.java文件中使用
setContentView(R.layout.activity_main);
显示布局效果
main.xml
res/values/strings.xml 用于定义应用中字符串常量
使用XML布局文件控制UI界面 单击进入Android...
res/values/styles.xml 用于定义组件的样式
1.1.2 在代码中控制UI界面(不建议耦合性太高)
1.创建布局管理器
2.创建具体的组件
3.将创建的集体组件添加到布局管理器中
public class MainActivity extends AppCompatActivity {
public TextView text2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//创建布局管理器
frameLayout frameLayout=new frameLayout(this);
//设置背景
frameLayout.setBackgroundDrawable(this.getResources().getDrawable(R.drawable.ic_launcher_background));
//设置在Activity中显示framelayout
setContentView(frameLayout);
TextView text1=new TextView(this);
text1.setText("在代码中控制UI界面");//文字
text1.setTextSize(TypedValue.COMPLEX_UNIT_PX,24);//文字大小单位像素
text1.setTextColor(Color.rgb(1,1,1));//文字颜色
frameLayout.addView(text1);//添加到布局管理中
text2=new TextView(this);
text2.setText("单击进入Android...");//文字
text2.setTextSize(TypedValue.COMPLEX_UNIT_PX,24);//文字大小单位像素
text2.setTextColor(Color.rgb(1,1,1));//文字颜色
frameLayout.LayoutParams params=new frameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT//创建保存布局参数的对象
);
params.gravity= Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL;//居中显示
text2.setLayoutParams(params);//设置布局参数
//按钮的事件监听器
text2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//对话框标题
new alertDialog.Builder(MainActivity.this).setTitle("系统提示")
.setMessage("确定进入吗?")//对话框显示内容
.setPositiveButton("确定",//确定按钮对应的事件
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
Log.i("Android","进入");//输出消息日志
}
}).setNegativeButton("退出",//退出按钮对应的事件
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
Log.i("Android","退出");//输出消息日志
finish();
}
}).show();
}
});
frameLayout.addView(text2);//text2添加到布局管理器中
}
}
1.1.3 使用XML和Java代码混合控制UI界面
原则把变化小、行为比较固定的组件放在XML布局文件中,把变化比较多香味控制比较复杂的组件交给Java代码来管理。
layout/activity_main.xml
MainActivity.java
public class MainActivity extends AppCompatActivity {
private ImageView[] img=new ImageView[12];//声明一个保存ImageView组件
private int[] imagePath=new int[]{
R.drawable.img01,R.drawable.img02,R.drawable.img03,R.drawable.img04
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout layout=(LinearLayout) findViewById(R.id.layout);//获取XML文件中定义的线性布局
for (int i=0;i
1.1.4 开发自定义的View
Android中所有的UI界面都是由View类和ViewGroup类及其子类组合而成。View类是所有UI类的基类
一般情况下,开发Android应用程序的UI界面都不直接使用View和ViewGroup类,而是使用这两个类的子类。开发者可以根据需要,通过继承View类来开发自己的组件。
自定义View组件
1.创建一个继承android.view.View类的View类,并重写构造方法
2.根据需要重写相应的方法。
3.在项目的活动中,创建并实例化自定义View类,并将其添加到布局管理器中
layout/main.xml
KiteView.java
public class KiteView extends View {
public float bitmapX;//风筝的X轴坐标
public float bitmapY;//风筝的Y轴坐标
public KiteView(Context context){
super(context);
bitmapX=750;//默认显示的X轴坐标
bitmapY=500;//默认显示的Y轴坐标
}
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
Paint paint=new Paint();//创建并实例化paint对象
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.kite);//根据图片生成位图
canvas.drawBitmap(bitmap,bitmapX,bitmapY,paint);//生成风筝
if (bitmap.isRecycled()){//判断是否被强制回收
bitmap.recycle();//强制回收
}
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
frameLayout frameLayout = (frameLayout) findViewById(R.id.mylayout);//获取帧布局管理器
final KiteView kite = new KiteView(MainActivity.this);//创建并实例化kite类
//添加事件监听器
kite.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
kite.bitmapX=event.getX();//设置X坐标
kite.bitmapY=event.getY();//设置Y坐标
kite.invalidate();//重新绘制图形
return true;
}
});
frameLayout.addView(kite);//添加到布局管理器中
}
}
1.2 布局管理器
1.2.1线性布局
在线性布局中,每一行(针对垂直排列)或每一列(针对水平排列)中只能放一个组件,Android的线性布局不会换行,当组件排列到窗体边缘后,后面的组件不会被显示出来。
排列方式由android:orientation控制
对齐方式由android:gravity控制
线性布局实现4个按钮
layout/main.xml
1.2.2表格布局
表格布局以行、列的形式来管理放入其中的UI组件。表格布局使用使用标记定义,在表格布局中,可以添加多个标记,每个 标记占用一行。由于标记也是容器,所以还可在该标记中添加其他组件,每添加一个组件,表格就会增加一列。在表格布局中,列可以被隐藏,也可以被设置为伸展的,从而填充可利用的屏幕空间,还可以设置为强制收缩,直到表格匹配屏幕大小。
如果在表格布局中, 直接向中添加 UI组件,那么该组件将独占一行。
TableLayout继承了LinerLayout,所以它支持后者的全部XML属性
main.xml
1.2.3 帧布局
在帧布局管理器中,每加入一个组件,都将创建一个空白的去与,通常称为一帧,这些帧都会根据gravity属性执行自动对齐。默认情况下,帧布局从屏幕的左上角坐标点开始布局,多个人组件层叠排序,后面的组件覆盖前面的组件。
main.xml
1.2.4 相对布局
相对布局是指按照组件之间的相对位置来进行布局,如某个组件在另一个组件的左边、右边、上方或下方等。在Android中,可以在XML布局文件中定义相对布局管理器,也可以使用Java代码来创建。推荐使用前者。在XML布局文件中定义相对布局管理器可以使用标记
在相对布局管理器中,只有上面介绍的两个属性是不够的,为了更好地控制该布局管理器中各子组件的布局分布,RelativeLayout提供了一个内部类RelativeLayout.LayoutParams,通过该类提供的大量XML属性,可以很好地控制相对布局管理器中各组件的分布方式。
1.2.5 【案例】使用表格布局和线性布局实现分类工具栏
1.3 基本组件
1.3.1 文本框与编辑框
1.文本框
在Android中,文本框使用TextView表示,用于在屏幕上显示文本。与Java中的文本框组件不同,Text View相当于Java中的标签,也就是JLable。需要说明的是,Android 中的文本框组件可以显示单行文本,也可以显示多行文本,还可以显示带图像的文本。在Android中,可以使用两种方法向屏幕中添加文本框: -种是通过在XML布局文件中使用标记添加;另一种是在Java文件中,通过new关键字创建。推荐采用第一种方法, 也就是通过标记在XML布局文件中添加文本框
2.编辑框
在Android中,编辑框使用EditText表示,用于在屏幕上显示文本输入框,这与Java中的文本框组件功能类似。
需要说明的是,Android 中的编辑框组件可以输入单行文本,也可以输入多行文本,还可以输入指定格式的文本(如
密码、电话号码、E-mail 地址等)。
在Android中,可以使用两种方法向屏幕中添加编辑框: - -种是通过在XML布局文件中使用标记添
加;另一种是在Java文件中,通过new关键字创建。推荐采用第一种方法,也就是通过标记在XML布局
文件中添加编辑框。
由于EditText类是TextView的子类,所以对于表3.5中列出的XML属性,同样适用于EditText 组件。需要特别
注意的是,在EditText组件中,android:inputType 属性可以帮助输入框显示合适的类型。例如,要添加一个密码框,
可以将android:inputType属性设置为textPassword。
在屏幕中添加编辑框后,还需要获取编辑框中输入的内容,这可以通过编辑框组件提供的getText()方法实现。使
用该方法时,先要获取到编辑框组件,然后再调用getText()方法。例如,要获取布局文件中添加的id属性为login 的
编辑框的内容,可以通过以下代码实现:
EditText login= (EditText)findViewById(R. id.1ogin);
String loginText= login. getText().toString();
注册案例
xml
java
package com.jingyi.register;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.btn1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText nicknameText = (EditText) findViewById(R.id.nickname);//获取昵称编辑框组件
String nickname = nicknameText.getText().toString();//获取输入的昵称内容
EditText pwdText = (EditText) findViewById(R.id.pwd);//获取密码编辑框的组件
String password= pwdText.getText().toString();//获取输入的密码
EditText apwdText = (EditText) findViewById(R.id.apwd);//获取再次密码编辑框的组件
String apassword= apwdText.getText().toString();//获取第二次输入的密码
EditText emailText = (EditText) findViewById(R.id.email);//获取E-mail编辑狂组件
String email = emailText.getText().toString();//获取输入的E-mail地址
Log.i("编辑框","会员昵称:"+nickname);
Log.i("编辑框","E-mail地址:"+email);
if (password.equals(apassword)){
Log.i("编辑框","密码:"+password);
}else{
Log.i("提示","前后两次输入的密码不一致!");
}
}
});
}
}
1.3.2 按钮
Android中提供了普通按钮和图片按钮两种按钮组件。这两种按钮组件都用于在UI界面上生成一-个可以单击的按
钮。当用户单击按钮时,将会触发-一个onClick事件,可以通过为按钮添加单击事件监听器指定所要触发的动作。
1.普通按钮
按钮监听事件
在屏幕上添加按钮后,还需要为按钮添加单击事件监听器,才能让按钮发挥其特有的用途。Android 提供了两种为按钮添加单击事件监听器的方法,-种是在Java代码中完成,例如,在Activity的onCreate()方法中完成,具体的代码如下:
import android.view.View.onClickListener ;
import android.widget.Button;
Button login= (Button)findViewById(R. id.login);
login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//编写要执行的动作代码
}
});
另一种是在Activity中编写-个包含View类型参数的方法,并且将要触发的动作代码放在该方法中,然后在布局文件中,通过android:onClick属性指定对应的方法名实现。例如,在Activity中编写一个名为myClick0的方法,关键代码如下:
public void myClick(View view){
//编写要执行的动作代码
}
2.图片按钮
xml
java
package com.jingyi.btn;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.login);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "您点击了普通按钮", Toast.LENGTH_SHORT).show();
}
});
}
public void myClick(View view){
Toast.makeText(MainActivity.this, "您点击了图片按钮", Toast.LENGTH_SHORT).show();
}
}
1.3.3 单选按钮和复选框
1.单选按钮
在默认情况下,单选按钮显示为一个圆形图标,并且在该图标旁边放置一些说明性文字。在程序中,一般将多个单选按钮放置在按钮组中,使这些单选按钮表现出某种功能,当用户选中某个单选按钮后,按钮组中的其他按钮将被自动取消选中状态。在Android中,单选按钮使用RadioButton表示,而RadioButton类又是Button的子类,所以单选按钮可以直接使用Button支持的各种属性。
事件监听
在改变单选按钮组的值时获取选中项的值时,首先需要获取单选按钮组,然后为其添加OnCheckedChangeListener,并在其onCheckedChanged)方法中根据参数checkedId获取被选中的单选按钮,并通过其getText()方法获取该单选按钮对应的值。例如,要获取id属性为radioGroupl的单选按钮组的值,可以通过下面的代码实现。
RadioGroup sex= ( RadioGroup)findViewById(R.id.radioGroup1);
sex. setonCheckedChangeListener (new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup grouRe1 int, checkedId) {
RadioButton r= ( RadioButton)findViewById(checkedId);
r.getText();//获取被选中的单选按钮的值
});
[V]单击其他按钮时获取
单击其他按钮时获取选中项的值时,首先需要在该按钮的单击事件监听器的onClick(方法中,通过for循环语句遍历当前单选按钮组,并根据被遍历到的单选按钮的isChecked)方法判断该按钮是否被选中,当被选中时,通过单选按钮getText()方法获取对应的值。例如,要在单击‘提交’按钮时,获取id属性为radioGroupl 的单选按钮组的值,可以通过下面的代码实现。
final RadioGroup sex=(RadioGroup )findViewById(R. id. radioGroup1);
Button button=( Button )findViewById(R. id. button1);
//获取一个提交按钮
button. setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
for(int i=0;i
案例
xml
java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final RadioGroup sex = (RadioGroup) findViewById(R.id.radioGroup1);//获取按钮组
sex.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {//为单选按钮组添加事件监听器
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
RadioButton r = (RadioButton) findViewById(checkedId);//获取被选择单选按钮
Log.i("单选按钮","您的选择是"+r.getText());
}
});
//通过提交按钮获取单选按钮选项
Button btn = (Button) findViewById(R.id.btn1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int i=0;i
2.复选框
在默认情况下,复选框显示为一个方块图标,并且在该图标旁边放置一些说 明性文字。与单选按钮唯一不同的是,复选框可以进行多选设置,每一个复 选框都提供“选中”和“不选中”两种状态。在Android 中,复选框使用CheckBox表示,而CheckBox类又是Button的子类,所以可以直接使用Button支持的各种属性。
监听事件
由于使用复选框可以选中多项,所以为了确定用户是否选择了某-项,还需要为每-一个选项添加事件监听器。例如,要为id为likel的复选框添加状态改变事件监听器,可以使用下面的代码:
final CheckBox like1=(CheckBox )findViewById(R. id.like1);//根据id属性获取复选框
like1. setonCheckedChangeListener (new OnCheckedChangeListener() {
@Override
public void onCheckedChanged ( CompoundButton buttonView, boolean isChecked) {
if(like1. isChecked()){ //判断该 复选框是否被选中
like1. getText(); // 获取选中项的值
}
}
});
案例
xml
java
public class MainActivity extends AppCompatActivity {
//重写监听方法
private CompoundButton.onCheckedChangeListener checkbox_listener= new CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
Log.i("复选框","选择了["+buttonView.getText().toString()+"]");
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CheckBox it1 = (CheckBox) findViewById(R.id.item1);
CheckBox it2 = (CheckBox) findViewById(R.id.item2);
CheckBox it3 = (CheckBox) findViewById(R.id.item3);
it1.setOnCheckedChangeListener(checkbox_listener);
it2.setOnCheckedChangeListener(checkbox_listener);
it3.setOnCheckedChangeListener(checkbox_listener);
Button button = (Button) findViewById(R.id.btn1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String items=new String();
if (it1.isChecked()){
items+=it1.getText().toString()+",";
}if (it2.isChecked()){
items+=it2.getText().toString()+",";
}if (it3.isChecked()){
items+=it3.getText().toString()+",";
}
Toast.makeText(MainActivity.this, items, Toast.LENGTH_SHORT).show();
}
});
}
}
1.3.4 图像视图
图像视图(ImageView) ,用于在屏幕中显示任何Drawable对象,通常用来显示图片。
xml
1.3.5 列表选择框
Android中提供的列表选择框(Spinner) 相当于在网页中常见的下拉列表框,通常用于提供一系列可选择的列表项供用户进行选择,从而方便用户。
其中,android:entries 为可选属性,用于指定列表项,如果在布局文件中不指定该属性,可以在Java代码中通过为其指定适配器的方式指定; android:prompt 属性也是可选属性,用于指定列表选择框的标题。
直接在布局文件中显示列表项
main.xml
valus/arrays.xml
- 辽宁省
- 河北省
- 吉林省
- 黑龙江省
- 山东省
事件监听器
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Spinner spinner = (Spinner) findViewById(R.id.spinner1);
spinner.getSelectedItem();//获取下拉框中的所有选择项
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
String itempos = parent.getItemAtPosition(position).toString();//被选中项
Log.i("Spinner被选中",itempos);
}
@Override
public void onNothingSelected(AdapterView> parent) {
}
});
}
}
在代码中实现要显示的列表项
通过数组资源文件创建
ArrayAdapter adapter = ArrayAdapter.createFromResource(
this,R.array.province, android.R.layout.simple_dropdown_item_1line
);
adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
spinner.setAdapter(adapter);//将适配器与选择列表关联
通过在Java文件中使用字符串数组创建
String[] province = {"辽宁省", "黑龙江省", "吉林省"};
ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_spinner_dropdown_item,province);
//为适配器设置列表框下拉时的选项样式
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//将适配器与选择列表关联
spinner.setAdapter(adapter);
1.3.6 列表视图
列表视图(ListView)是Android中最常用的一种视图组件,它以垂直列表的形式列出需要显示的列表项。例如,
显示系统设置项或功能内容列表等。
1.使用ListView组件创建
在使用列表视图时,重要的是如何设置选项内容。同Spinner列表选择框一样,如果没有在布局文件中为ListView指定要显示的列表项,也可以通过为其设置Adapter来指定需要显示的列表项。通过Adapter来为ListView指定要
显示的列表项,可以分为以下两个步骤。
(1)创建Adapter对象。对于纯文字的列表项,通常使用ArrayAdapter对象。创建ArayAdapter对象通常可以有两种方式:一种是通过数组资源文件创建:另-种是通过在Java文件中使用字符串数组创建。这与1.3.5 节Spinner列表选择框中介绍的创建ArrayAdapter对象基本相同,所不同的就是在创建该对象时,指定列表项的外观
形式。为ListView指定的外观形式通常有以下几个。
simple_ list item_ 1:每个列表项都是一个普通的文本。
simple_ list item 2: 每个列表项都是一-个普通的文本(字体略大)。
simple list item. checked: 每个列表项都有-个已选中的列表项。
simple list item_ multiple_ choice:每个列表项都是带复选框的文本。
simple_ list item. single choice: 每个列表项都是带单选按钮的文本。
(2)将创建的适配器对象与ListView 相关联,可以通过ListView对象的setAdapter()方法实现,具体代码如下:
listView. setAdapter (adapter); //将适配器 与ListView关联
适配器指定列表创建ListView
xml
java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ListView listView = (ListView) findViewById(R.id.listView1);
ArrayAdapter adapter = ArrayAdapter.createFromResource(
this,R.array.song, android.R.layout.simple_list_item_checked
);//创建适配器
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
String pos = parent.getItemAtPosition(position).toString();
Toast.makeText(MainActivity.this, pos, Toast.LENGTH_SHORT).show();
}
});
}
}
2.使用Activity继承ListActivity实现
如果程序的窗口仅仅需要显示一个列表,则可以直接让Activity继承ListActivity来实现。继承了ListActivity的类中无须调用setContentView0方法来显示页面,而是可以直接为其设置适配器,从而显示一 个列表。
public class MainActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String[] songs = {"歌曲名:Normal No More (Explicit),歌手名:Tysm", "歌曲名:Not A Love Song,歌手名:Bülow", "歌曲名:Old Town Road,歌手名:Lil Nas X"};
ArrayAdapter adapter = new ArrayAdapter(
this, android.R.layout.simple_list_item_single_choice,songs
);
setListAdapter(adapter);
}
@Override
protected void onListItemClick(ListView l,View v,int position,long id){
super.onListItemClick(l,v,position,id);
String s = l.getItemAtPosition(position).toString();
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
}
}
1.3.7 日期、时间拾取器
为了让用户能够选择日期和时间,Android 提供了日期、时间拾取器,分别是DatePicker组件和TimePicker组件。这两个组件使用比较简单,可以在Android Studio的可视化界面设计器中,选择对应的组件并拖曳到布局文件中。为了可以在程序中获取用户选择的日期、时间,还需要为DatePicker和TimePicker组件添加事件监听器。其中,DatePicker组件对应的事件监听器是OnDateChangedListener,而TimePicker组件对应的事件监听器是
OnTimeChangedListener。
public class MainActivity extends AppCompatActivity {
int year;
int month;
int day;
int hour;
int minute;
int second;
//时间显示函数
private void show(int year,int month,int day,int hour,int minute){
String dtstr=year+"年"+(month+1)+"月"+day+"日 "+hour+":"+minute;//获取拾取器设置的日期与时间 ,DatePicker获取到的月份是0~11所以+1
Toast.makeText(this, dtstr, Toast.LENGTH_SHORT).show();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DatePicker datePicker = (DatePicker) findViewById(R.id.datePicker1);
TimePicker timePicker = (TimePicker) findViewById(R.id.timePicker);
timePicker.setIs24HourView(true);//设置为24小时制
Calendar calendar = Calendar.getInstance();
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH);
day = calendar.get(Calendar.DAY_OF_MONTH);
hour = calendar.get(Calendar.HOUR_OF_DAY);
minute = calendar.get(Calendar.MINUTE);
//初始化日期拾取器,并指定监听器
datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
MainActivity.this.year=year;//改变year的值
MainActivity.this.month=monthOfYear;//改变month的值
MainActivity.this.day=dayOfMonth;//改变day的值
show(year,monthOfYear,dayOfMonth,hour,minute);
}
});
//时间拾取器的监听器
timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
MainActivity.this.hour=hourOfDay;
MainActivity.this.minute=minute;
show(year,month,day,hourOfDay,minute);
}
});
}
}
1.3.8 计时器
计时器(Chronometer) 组件可显示从某个起始时间开始,- 共过去了多长时间的文本。由于该组件继承自TextView,所以它以文本的形式显示内容。使用该组件也比较简单,通常只需要使用以下5个方法。
setbase(): 用于设置计时器的起始时间。
setFormat(): 用于设置显示时间的格式。
start(): 用于指定开始计时。
stop(): 用于指定停止计时。
setonChronometerTickListener(): 用于为计时器绑定事件监听器,当计时器改变时触发该监听器。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Chronometer ch = (Chronometer) findViewById(R.id.chronometer01);//设置计时器组件
ch.setbase(SystemClock.elapsedRealtime());//设置当前时间为起始时间
ch.setFormat("已用时间:%s");//设置时间显示的格式
ch.start();//开启计时器
//添加监听器
ch.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
if (SystemClock.elapsedRealtime()-ch.getbase()>=1000000){
ch.stop();
}
}
});
}
}
1.3.9 案例:实现跟踪鼠标单击状态的图片按钮
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageButton imageButton = (ImageButton) findViewById(R.id.start);
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_SHORT).show();
}
});
}
}
1.3.10 案例:实现带图标的ListView
res/layout/main.xml
res/layout/items.xml
java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.listView1);
int[] imageId = {R.drawable.secret, R.drawable.safe, R.drawable.set,
R.drawable.wifi, R.drawable.doc, R.drawable.gps, R.drawable.music,
R.drawable.email
};//保存图片id的数组
String[] title = {"保密设置", "安全", "系统设置", "上网", "我的文档",
"GPS导航", "我的音乐", "E-mail"};//列表项文字
List



