常用组件
1. 按钮与事件响应
- match_partent:表示组件的宽度与其父容器一样宽
- wrap_content:表示根据内容指定组件的高度
- android:textAllCaps,设置按钮文本是否所有字母都大写,默认是true,即按钮的文本内容全部大写
1.1 响应单击操作
package com.syl.buttondemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextClock;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((Button)findViewById(R.id.btn1)).setOnClickListener(this);
((Button)findViewById(R.id.btn2)).setOnClickListener(this);
((Button)findViewById(R.id.btn3)).setOnClickListener(this);
}
@Override
public void onClick(View v){
TextView txt1 = (TextView)findViewById(R.id.txt1);
switch (v.getId()){
case R.id.btn1:{
txt1.setText("单击Button1");
}break;
case R.id.btn2:{
txt1.setText("单击Button2");
}break;
case R.id.btn3:{
txt1.setText("单击Button3");
}break;
}
}
}
注意:此处实现多个按钮响应的区别
1.2 响应长按操作并震动
- 实现View.OnLongClickListener接口,并实现其中的onLongClickI()方法
- onTouch()方法中返回一个boolean类型的值,返回true值时,不再响应其他组件操作
package com.syl.buttondemo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.os.Vibrator;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnLongClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnLongClickListener(this);
}
//长按
@Override
public boolean onLongClick(View v){
if(v.getId() == R.id.btn1){
Toast.makeText(MainActivity.this,"长按事件",Toast.LENGTH_SHORT).show();
//震动提示
Vibrator vib = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
vib.vibrate(500);//震动半秒
}
return true;
}
}
- 响应长按操作也需注册,(例如在onCreate()方法中,让btn按钮响应长按操作)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnLongClickListener(this);
}
- 需要在AndroidManifest.xml中声明需要使用的震动权限
1.2 响应触摸事件
- 处理手指按下、移动、离开的操作
- 实现View.OnTouchListener()方法,并重写其中的onTouch()方法
- onTouch()方法中返回一个boolean类型的值,返回true值时,不再响应其他组件操作
- 组件需在onCreate()方法中注册响应事件
- 代码
package com.syl.buttondemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn2 = (Button)findViewById(R.id.btn2);
btn2.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event){
if(v.getId() == R.id.btn2){
TextView txt = (TextView) findViewById(R.id.txt1);
if(event.getAction()==MotionEvent.ACTION_DOWN){
txt.setText("手指按下");
}else if(event.getAction()==MotionEvent.ACTION_UP){
txt.setText("手指离开");
}else if(event.getAction()==MotionEvent.ACTION_MOVE){
txt.setText("手指滑动");
}
}
return true;
}
}
2. 文本组件
2.1 TextView
- android:textSize,设置文本尺寸,单位是sp
- android: Color,设置字体颜色
- android: gravity,设置文字对齐方式
2.2 EditText:输入、显示文本内容
package com.syl.edittextdemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
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 btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText edit1 = (EditText)findViewById(R.id.edit1);
Button btn = (Button)findViewById(R.id.btn1);
btn.setText(edit1.getText());
}
});
}
}
3. 消息与对话框
3.1 Toast:显示提示信息
- 参数1:指定一个Content对象
- 参数2:指定需要显示的文本
- 参数3:指定信息显示的时间长短(Toast.LENGTH_LONG / Toast.LENGTH_SHORT)
- 创建对象后,调用它的show()方法即可显示信息
3.2 AlertDialog:用于显示包含选择按钮的对话框
- 使用AlertDialog.Builder对象
- setTitle() :指定对话框的标题信息
- setMessage():指定对话框提示消息
- setCancelable():指定对话框是否可以通过其他方式取消
- setPositiveButton():指定肯定操作
- setNegativeButton():指定否定操作
- setNeutralButton():可定义第三个按钮,类似再看看的意思
package com.syl.alertdialogdemo;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(this);
}
@Override
public void onClick(View v){
if(v.getId()==R.id.btn1){
AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("请确认您的操作");
dlg.setMessage("真得要这么做吗");
dlg.setCancelable(false);
//肯定操作按钮
dlg.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"确认操作",Toast.LENGTH_LONG).show();
}
});
//取消操作
dlg.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"取消操作",Toast.LENGTH_SHORT).show();
}
});
dlg.show();
}
}
}
3.3 Progress:用于显示一些信息和一个正在忙的图标,用于指示程序正在执行
4. 菜单
在Activity中使用菜单,需要做以下几个步骤
- 第一步:使用XML文件定义菜单
- 第二步:在Activity中关联菜单
- 第三步:定义各个菜单项的响应代码
package com.syl.menudemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//关联菜单
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater mi = getMenuInflater();
mi.inflate(R.menu.mainmenu,menu);
return true;
}
//响应菜单项
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()){
case R.id.menuitem1:
{
Toast.makeText(this,"菜单项1",Toast.LENGTH_SHORT).show();
}break;
case R.id.menuitem2:
{
Toast.makeText(this,"菜单项2",Toast.LENGTH_SHORT).show();
}break;
case R.id.menuitem3:
{
Toast.makeText(this,"菜单项3",Toast.LENGTH_SHORT).show();
}break;
}
return true;
}
}
例二:嵌套菜单
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-zuto">
<item
android:id="@+id/menu_settings"
android:title="设置"
android:icon="@mipmap/ic_launcher"
app:showAsAction="always"/>
<item
android:id="@+id/menu_check"
android:title="自动保存"
android:checkable="true"
android:checked="true"/>
<item
android:id="@+id/menu_help"
android:title="学号姓名">
<menu>
<item
android:id="@+id/xuehao"
android:title="学号"/>
<item
android:id="@+id/xingming"
android:title="姓名"/>
</menu>
</item>
<item
android:id="@+id/menu_exit"
android:title="退出"
app:showAsAction="never"
android:orderInCategory="100"/>
</menu>
5. 单选按钮:RadioButton
- 常和RadioGroup组合使用
- android:orientation属性,用于设置单选按钮的排列方式(horizontal水平,vertical垂直)
- 通过RadioGroup对象的getCheckedRadioButtonId()方法获取已选中对象RadioButton的ID
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请选择性别!"/>
<RadioGroup
android:id="@+id/rg_sex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/sex_0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保密"
android:checked="true"/>
<RadioButton
android:id="@+id/sex_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="男"/>
<RadioButton
android:id="@+id/sex_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="女"/>
</RadioGroup>
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button1"/>
</LinearLayout>
package com.syl.radiobuttondemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RadioGroup rgsex = (RadioGroup)findViewById(R.id.rg_sex);
Button btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int rdoId= rgsex.getCheckedRadioButtonId();
String msg;
switch (rdoId){
case R.id.sex_1:msg="男";break;
case R.id.sex_2:msg="女";break;
default:msg="保密";break;
}
Toast.makeText(MainActivity.this,msg,Toast.LENGTH_SHORT).show();
}
});
}
}
6. 复选框:CheckBox
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<CheckBox
android:id="@+id/chk1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="经济"/>
<CheckBox
android:id="@+id/chk2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="汽车"/>
<CheckBox
android:id="@+id/chk3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="音乐"/>
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="关注的内容" />
<TextView
android:id="@+id/txt1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
package com.syl.checkbox;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private int[] chkList = {R.id.chk1,R.id.chk2,R.id.chk3};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn1 =(Button)findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String msg = "";
for(int chkId: chkList){
CheckBox chk = (CheckBox)findViewById(chkId);
if(chk.isChecked()) msg = msg + "" + chk.getText();
}
TextView txt1 = (TextView)findViewById(R.id.txt1);
txt1.setText(msg);
}
});
}
}
注意:如需要在复选框在选中状态自动响应时,可以实现它的onCheckedChanged事件
7. 下拉列表:Spinner
出现问题,下次解决
8. 图像组件:ImageView
- 在main_layout.xml布局文件中创建ImageView组件,其中android:src属性设置图片文件
- 在res/drawable中添加图片文件
- 利用计数奇偶来切换图片
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/img1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/robot"/>
</LinearLayout>
package com.syl.imageviewdemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
private int counter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView image = (ImageView)findViewById(R.id.img1);
image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ImageView img = (ImageView)v;
if(counter % 2 ==0){
img.setImageResource(R.drawable.round);
counter++;
}else{
img.setImageResource(R.drawable.robot);
counter++;
}
}
});
}
}
9. 列表:ListView
9.1 绑定列表数据
9.1.1 使用ArrayAdapter泛型类创建一个数组适配器对象,用于向ListView组件绑定数据,其构造函数包括以下三个参数
- 第一个参数:指定一个Content对象
- 第二个参数:一个列表项的布局ID
- 第三个参数:String数组,指定填充列表的文本内容
9.1.2 代码最后,使用ListView对象的setAdapter()方法将Arraydapter对象绑定到ListView对象
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/list1"/>
</LinearLayout>
package com.syl.listviewdemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.lang.reflect.Array;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
//列表显示的数据
private String[] data = {"aaa","bbb","ccc","ddd"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化列表
ArrayAdapter<String> ada = new ArrayAdapter<>(
MainActivity.this,
android.R.layout.simple_list_item_1,
data);
ListView list1 = (ListView)findViewById(R.id.list1);
list1.setAdapter(ada);
}
}
9.2 响应列表项单击
9.2.1 MainActivity类实现AdapterView.OnItemClickListener接口,并重写onItemClick()方法
9.3 获取正确的项目索引
。。。。。
10. 进度条: ProgressBar
package com.syl.progressbardemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ProgressBar pb1 = (ProgressBar)findViewById(R.id.pb1);
pb1.setProgress(0);
Button btn = (Button)findViewById(R.id.btn1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pb1.setProgress(0);
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
int cur = pb1.getProgress();
cur += 10;
if(cur <= 100){
pb1.setProgress(cur);
}else {
this.cancel();
}
}
};
timer.scheduleAtFixedRate(task,0,1000);
}
});
}
}
11. 滑块:SeekBar
11.1 SeekBar组件中要设置最大值
11.2 在MainActivity.java文件中,实现SeekBar.OnSeekBarChangeListener接口,并重写以下三个方法
- onProgressChanged();滑动组件时执行
- onStartTrackingTouch();单击组件时执行,示例中背景色会变为GRB值都为200的灰色
- onStopTrackingTouch();手指离开SeekBar组件时执行,示例中背景恢复为白色
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<SeekBar
android:id="@+id/seekbar1"
android:layout_width="match_parent"
android:layout_height="50dp"
android:max="100"/>
<TextView
android:id="@+id/txt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
package com.syl.seekbardemo;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.SeekBar;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener {
TextView txt1;
SeekBar seekbar1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
seekbar1 =(SeekBar)findViewById(R.id.seekbar1);
seekbar1.setOnSeekBarChangeListener(this);
txt1 = (TextView)findViewById(R.id.txt1);
}
@Override
public void onProgressChanged(SeekBar seekBar,int progress,boolean fromUser){
txt1.setText(String.format("当前值:%d",progress));
}
@Override
public void onStartTrackingTouch(SeekBar seekbar1){
seekbar1.setBackgroundColor(Color.rgb(200,200,200));
}
@Override
public void onStopTrackingTouch(SeekBar seekbar1){
seekbar1.setBackgroundColor(Color.WHITE);
}
}
12. 选择日期和时间对话框
。。。。