《Android开发实战 从学习到产品》李瑞琪编著 学习笔记。
一、常用基本控件的使用
1.Android常用控件类:
控件名称 | 描述 | 控件名称 | 描述 |
---|---|---|---|
TextView | 文本显示控件 | SeekBar | 拖动条控件 |
Button | 按钮控件 | ProgressBar | 进度条控件 |
EditText | 文本编辑框控件 | ScrollView | 可滚动视图控件 |
ImageView | 图片显示控件 | DatePicker | 日期显示控件 |
ImageButon | 图片作为按钮控件 | TimePicker | 时间显示控件 |
RadioGroup | 单选按钮控件 | Dialog | 对话框控件 |
CheckBox | 复选框控件 | Toast | 信息提示框控件 |
Spinner | 下拉列表控件 |
2.基本控件的使用
TextView、EditText、Button、SeekBar、ImageView、RadioGroup控件。activity_main.xml(即Activity对应的布局文件)中代码(代码中注释了部分属性功能):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="部分控件!"
android:id="@+id/show_text"
android:textSize="25dp"
android:textColor="#ff00ff"/>
<EditText
android:layout_width="match_parent"
android:layout_height="70dp"
android:id="@+id/show_edit"
android:enabled="true"
android:hint="(文本编辑框控件)请输入数字:"
android:inputType="number"
android:textSize="25dp"
/>
<SeekBar
android:layout_width="match_parent"
android:layout_height="30dp"
android:id="@+id/seek_bar" /><!--SeekBar拖拉控件-->
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:id="@+id/show_button"
android:text="展现一个button按钮"/><!--android:visibility="gone"控件不可见,不占空间-->
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/show_image"
android:src="@drawable/cry"
android:visibility="invisible"/><!--控件不可见,占空间-->
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/show_group_button"
android:orientation="horizontal">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/paiqiu"
android:text="排球"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/lanqiu"
android:text="篮球"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/zuqiu"
android:text="足球"/>
</RadioGroup>
</LinearLayout>
控件在布局中显示效果:
在activity_main.xml设置了Button和ImageView不可见(可直接.XML文件改属性值使之可见),也可在activity_main.xml对应的MainActivity.java文件中用Java码设置其可见,可在MainActivity类中创建一个initView()方法,最后在onCreate()方法中调用该方法,代码中注释了部分方法功能。
private void initView(){
TextView textView = (TextView)findViewById(R.id.show_text);//获取TextView控件
textView.setText("通过代码控制TextView");//设置TextView内容
textView.setTextSize(20);//设置textView文字大小
EditText editText = (EditText)findViewById(R.id.show_edit);
editText.getText().toString();//获取editText内容
editText.setInputType(InputType.TYPE_CLASS_TEXT);//设置EditText输入内容为Text类型
Button button = (Button)findViewById(R.id.show_button);
button.setVisibility(View.VISIBLE);//设置Button可见
ImageView imageView = (ImageView)findViewById(R.id.show_image);
imageView.setVisibility(View.VISIBLE);
imageView.setImageResource(R.drawable.cry);//设置ImageView的图片
RadioGroup radioGroup = (RadioGroup)findViewById(R.id.show_group_button);
radioGroup.check(R.id.zuqiu);//默认选中足球
}
使用代码控制控件后在布局中所显示:
Toast控件:Android中用来显示信息的一种方式,无焦点,过一定时间会自动消失。使用Toast 只需设置要显示的内容、显示时长、显示位置后调用show()方法即可。创建一个方法使用Toast控件:
private void toast(){
/*一般情况使用Toast类的静态方法makeToast,后调用show()方法
* 参数意义:makeToast(context对象,“显示内容”,显示长度)*/
Toast toast = Toast.makeText(this,"显示位置的方式",Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER,0,0);//设置Toast显示位置,默认界面底部
toast.show();
Toast.makeText(this, "常用方式", Toast.LENGTH_SHORT).show();//一般显示Toast方式
}
在onCreate()方法中调用上述方法,显示如图:
**Dialog控件:**对话框控件,一个小窗口,有四种常用对话框:
- AlertDialog:警告对话框,使用最广范。可包含 标题、内容消息或选择列表、最多3个按钮。
AlterDialog create()根据设置的属性创建一个 AlterDialog
AlterDialog showo根据设置的属性创建一个 Alterdialog,并显示在屏幕上
AlterDialog, Builder setTitleo设置标题
AlterDialog Builder setlcon0设置标题的图标
AlterDalog Builder setmessage()设置标题的内容
AlterDialog, Builder setcancelableo设置是否模态,一般设置为 false,表示模态,要求用户必须采取行动才能继续进行剩下的操作 - ProgressDialog:进度条对话框,对进度条进行了简单封装。
- DatePickerDialog:日期对话框。
- TimePickDialog:时间对话框。
AlertDialog实例:创建myDialog()方法:
private void myDialog(){
/*初始化一个ALertDialog的内置对象builder*/
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("提示!");//设置Dialog的标题
builder.setMessage("现在显示的是包含多个按钮及一个Icon的对话框");//设置显示内容
builder.setIcon(R.drawable.cry);//设置Icon
/*添加一个确定按钮*/
builder.setPositiveButton("确定",new DialogInterface.OnClickListener(){
//设置点击确定后使Toast显示一行文字,并使Dialog消失
public void onClick(DialogInterface dialog,int which){
Toast.makeText(MainActivity.this, "确定被点击了", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
/*添加一个以后再说按钮*/
builder.setNegativeButton("以后再说",new DialogInterface.OnClickListener(){
//设置点击确定后使Toast显示一行文字,并使Dialog消失
public void onClick(DialogInterface dialog,int which){
Toast.makeText(MainActivity.this, "以后再说被点击了", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
/*添加一个忽略按钮*/
builder.setNeutralButton("忽略",new DialogInterface.OnClickListener(){
//设置点击确定后使Toast显示一行文字,并使Dialog消失
public void onClick(DialogInterface dialog,int which){
Toast.makeText(MainActivity.this, "忽略被点击了", Toast.LENGTH_SHORT).show();
dialog.cancel();
}
});
/*使用模态,即不对上述三个按钮做操作就不能继续其他操作,默认为可进行其他操作*/
builder.setCancelable(false);
builder.show();//调用show()方法显示这个Dialog
}
在onCreate()中调用它,显示图:
3.Android中尺寸
- px:像素,Android中不建议使用。
- dp:非文字尺寸用dp
- sp:文字尺寸用sp
二、Android 中事件处理
事件处理基本可分为3个步骤:
<1>. 获取触发事件的对象。如点击了Button,就要获取该Button对象。
<2>. 实现一个对应事件的处理接口。每个事件都有对应的事件处理接口,在事件处理中必须实现事件处理接口。
<3>. 用获取的控件对象获取对象调用该控件的某个事件监听方法,将第二步实现的接口类的对象作为参数传入,并对该事件进行注册。
1.点击事件
点击事件:点击某个控件而触发的事件,常见于Button,TextView和ImageView等也有使用。
以Button和TextView为例:Activity对应的布局文件.XML中代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button_event"
android:text="来点我啊~"
android:textSize="26sp"
android:textColor="#ff00ff"
android:layout_marginBottom="10dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_event"
android:text="我是个TextView!"
android:textSize="26sp"/>
</LinearLayout>
Activity中处理代码(.java文件代码,详见注释):
package com.example.day0922eventactivity;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
// 实现View.OnClickListener 看下面3.~
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button button;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intiView();
}
private void intiView(){
button = (Button)findViewById(R.id.button_event);//1.使用indViewById获取Buttond按钮的对象
textView = (TextView)findViewById(R.id.text_event);// 获取TextView按钮的对象
button.setOnClickListener(this); //3.调用setOnClickListener点击事件的监听方法
textView.setOnClickListener(this); // 并将View.OnClickListener接口实现类的对象传入
// 实例是用Activity实现的,所以传入了this对象
//在第三步调用setOnClickListener()方法时,系统会对View进行注册,所以onClick()方法中可以从getId()方法获取控件id
}
public void onClick(View v){ //2.让Activity实现点击事件对的处理接口
// View.OnClickListener并实现onClick()方法
switch(v.getId()){
case R.id.text_event:
Toast.makeText(this,"您点击了一个TextView",Toast.LENGTH_LONG).show();
break;
case R.id.button_event:
Toast.makeText(this,"您点击了一个Button",Toast.LENGTH_LONG).show();
break;
}
}
}
效果图:
在处理点击事件时,实现事件处理接口的方式有三种,
- 主类中实现onClickListener接口:上述实例即为该种最常用方式,在主类中实现OnClickListener接口( implements View.OnClickListener)并重写onClick方法。
- 内部类方式实现:在Activity内创建一个内部类,并在内部类内重写onClicK(View view)方法。如(先在主类中删除implements View.OnClickListener):
/*二、内部类实现onClickListener()接口并重写onClick()方法*/
private class clickListener implements View.OnClickListener{
public void onClick(View v){
switch(v.getId()){
case R.id.text_event:
Toast.makeText(MainActivity.this,"您点击了一个TextView",Toast.LENGTH_LONG).show();
break;
case R.id.button_event:
Toast.makeText(MainActivity.this,"您点击了一个Button",Toast.LENGTH_LONG).show();
break;
}
}
}
private void intiView(){
button = (Button)findViewById(R.id.button_event);
textView = (TextView)findViewById(R.id.text_event);
button.setOnClickListener(new clickListener()); //传入实现了OnClickListener接口的类对象
textView.setOnClickListener(new clickListener());
}
效果相同,效果图亦相同。
- 匿名内部类方式实现:直接在控件对象调用setOnclickListener()方法时,以匿名内部类的方式传入事件处理接口的对象。如:
/**三、匿名内部类实现*/
private void intiView(){
button = (Button)findViewById(R.id.button_event);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"您点击了一个Button按钮",Toast.LENGTH_LONG).show();
}
});
textView = (TextView) findViewById(R.id.text_event);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"您点击了一个TextView按钮",Toast.LENGTH_LONG).show();
}
});
}
效果相同,需注意,该方式需要在Button和TextView中都这样处理,若点击事件较多会使得代码冗余。
2.长按事件
长按事件:长按了 某个控件而触发的事件。TextView、Button等控件经常会使用长按事件,另外布局管理器(如LinearLayout)也可以有长按事件。下面以LinearLayout为例,对LinearLayout添加长按事件,就在点击事件的基础上修改。
(1)给LinearLayout添加id(.XML文件中)
(2)让主Activity实现长按事件处理接口View.OnLongClickListener
public class MainActivity extends AppCompatActivity implements View.OnClickListener,View.OnLongClickListener
//View.OnClickListener是实现前面点击事件处理接口
(3)实现长按事件处理接口中的onLongClick方法
public boolean onLongClick(View v){ //长按事件
Toast.makeText(MainActivity.this,"您长按了一个LinearLayout",Toast.LENGTH_LONG).show();
return true;
}
(4)在initView()方法中获取LinearLayout对像,并调用setOnLongClickListener()方法进行注册:
linearLayout = (LinearLayout)findViewById(R.id.long_click_event);
linearLayout.setOnLongClickListener(this);
长按事件效果:
3.触摸事件
触摸事件:指触摸了某个控件而触发的事件,在TextView、ImageView等控件中较常用。现以TextView为例添加触摸事件(在前面点击事件的基础上添加的哦)。
(1)让Activity实现触摸事件的事件处理接口View.OnTouchListener。
public class MainActivity extends AppCompatActivity implements View.OnTouchListener{
...
}
(2)实现触摸事件接口中onTouch方法:
public boolean onTouch(View v, MotionEvent event){
Toast.makeText(this, "您触摸了一个TextView,它的座标是"+"X="+event.getX()+",Y="+event.getY(), Toast.LENGTH_SHORT).show();
return false;
}
如果同时对控件进行了 setOnClickListener()和setOnTouchListener()设置,那么只有当setOnTouchListener()返回false时点击事件才会响应。
(3)获取TextView后,调用setOnTouchListener()方法进行注册。
textView.setOnTouchListener(this);
触摸事件与其他事件不同的地方在于他在用户触摸控件之后会返回一个MotionEvent对象,使用此对象可以获取控件的座标。
4.按键事件
按键事件主要在EditText中使用,用于监听输入的内容。在点击事件的例子上稍加改动:
(1)在布局文件中加入一个EditText:
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/edit_event"
android:textSize="26sp"/>
(2)用Activity实现按键事件处理接口implements View.OnKeyListener
public class MainActivity extends AppCompatActivity implements View.OnKeyListener{
...
}
(3)实现按键事件处理接口中的方法onKey方法:
public boolean onKey(View v, int keyCode, KeyEvent event){ //按键事件
switch(event.getAction()){
case KeyEvent.ACTION_DOWN:
Toast.makeText(this, "按键落下啦!", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.ACTION_UP:
EditText et = (EditText)v;
Toast.makeText(this, "按键弹起啦!键入的是:"+et.getText().toString(), Toast.LENGTH_SHORT).show();
break;
}
return false;
}
实现onKey(View v,int keyCode,KeyEvent event),方法中3个参数:
- View参数:指操作事件的View对象
- keyCode:输入按键的编码数字
- event:表示按键落下与弹起的状态
返回值若返回的是true,意味着系统只处理代码中的这些事件,如本例中的Toast ,而不处理其他动作,如EditText中写入文本,所以一般情况下返回false。
(4)在initView中获取EditText控件,并调用setOnKeyListener()方法进行注册:
editText = (EditText)findViewById(R.id.edit_event);
editText.setOnKeyListener(this);
结果触发了事件
5.下拉列表的选中事件
(1)在布局文件中加入一个表示位置的下拉列表:
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/spinner_event"
android:entries="@array/location"/>
*android:entries 用来选择Spinner下拉选项内容的属性,在开发时,我们会在res/values中建立数组作为此属性的内容,向Spinner的下拉选项中注入数据。*因此,在res/values中新建一个location.xml,并建立一个数组:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="location">
<item>南昌</item>
<item>赣州</item>
<item>上饶</item>
<item>九江</item>
<item>抚州</item>
</string-array>
</resources>
(2)使Activity实现下拉列表事件处理接口 AdapterView.OnItemSelectedListener,实际为下拉列表某个条目的处理接口。实现该接口的处理方法onItemSelected方法:
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener,
/**下拉列表事件*/
public void onItemSelected(AdapterView<?>parent,View view,int position,long id){ //选中某个条目之后的处理方法
String value = parent.getItemAtPosition(position).toString();
editText.setText("你丫的位置是:"+value+"!"); //选中条目时显示在EditText中
}
public void onNothingSelected(AdapterView<?>parent){ //没有任何条目被选中的处理方法
}
(3)获取对象,调用监听方法
spinner = (Spinner)findViewById(R.id.spinner_event);
spinner.setOnItemSelectedListener(this);
运行结果:
6.单选按钮的改变事件
该事件只适用於单选按钮,实例如下:
(1)在文件中加入一个单选按钮
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:id="@+id/sex_event">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/male"
android:text="男"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/female"
android:text="女"/>
</RadioGroup>
(2)让Activity实现RadioGroup.OnClickListener接口,实现它得事件处理方法onCheckedChanged(),获取获取控件并调用监听事件,
//实现RadioGroup.OnClickListener接口
public class MainActivity extends AppCompatActivity implements RadioGroup.OnClickListener,...{
...
}
//实现它得事件处理方法onCheckedChanged()
public void onCheckedChanged(RadioGroup group,int checkedId){ //单选按钮事件
RadioButton radioButton = (RadioButton)findViewById(checkedId);
Toast.makeText(this, "您丫选择了:"+radioButton.getText().toString(), Toast.LENGTH_SHORT).show();
}
//获取获取控件并调用监听事件
radioGroup = (RadioGroup)findViewById(R.id.sex_event);
radioGroup.setOnCheckedChangeListener(this);
运行结果:
7.焦点事件
.
焦点事件是指在多控件或多组件状态下,操作某个控件就意味着该控件获取了焦点,同时之前获得焦点的控件失去了焦点。下面用两个EditText演示焦点事件。
布局文件添加两个EditView(同上),Activity实现焦点事件处理接口View.OnFcusChangeListener(同上),实现它的事件处理方法onFoucusChange(View v,boolean hasFoucus):
public void onFocusChange(View v,boolean hasFocus){ //焦点事件
if(hasFocus){
Toast.makeText(this, "第一个EditView获得了焦点", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "第二个EditView获得了焦点", Toast.LENGTH_SHORT).show();
}
}
获取控件对象(findViewById),调用监听方法(editText1.setOnFocusChangeListener(this);
editText2.setOnFocusChangeListener(this);),运行程序: