Android基础-03
01_android下数据库的创建(重点)
在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。
但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。 另外,在编写CREATE TABLE 语句时,你可以省略跟在字段名称后面的数据类型信息,如下面语句你可以省略 name字段的类型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20));
SQLite可以解析大部分标准SQL语句,如:
查询语句:
select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
如:select * from person
select * from person order by id desc
select name from person group by name having count(*)>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入语句:
insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘xx’,3)
更新语句:
update 表名 set 字段名=值 where 条件子句。如:update person set name=‘传智‘ where id=10
删除语句:
delete from 表名 where 条件子句。如:delete from person where id=10
获取添加记录后自增长的ID值:SELECT last_insert_rowid()
SQLiteOpenHelper:管理数据库的版本;
在android应用程序中创建按数据库的步骤:
1、写一个DBHelper,继承了SQLiteOpenHelper,重新写了父类的构造方法、onCreate、onUpGrade:
//创建数据库
DBHelper helper = new DBHelper(this, "account.db", null, 1);
onCreate是在数据库创建的时候调用的,主要用来初始化数据表结构和插入数据初始化的记录
onUpGrade是在数据库版本升级的时候调用的,主要用来改变表结构
2、调用db = helper.getWritableDatabase(),得到数据对象
数据库的存储位置:/data/data/ 包名/databases/数据库名
02_数据库sql语句的增删改查
03_android下数据库的增删改查(重点)
代码:
package com.itheima.db;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
private SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DBHelper helper = new DBHelper(this, "itheima.db", null, 1);
db = helper.getWritableDatabase();
}
public void insert(View view) {
db.execSQL("insert into account (name,money) values (‘liufeng‘,‘1000000‘)");
}
public void update(View view) {
db.execSQL("update account set money = ‘10000000‘ where name=‘liufeng‘");
}
public void query(View view) {
// 查询数据库返回一个结果集
Cursor cursor = db.rawQuery("select * from account where name = ?",
new String[] { "liufeng" });
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String name = cursor.getString(1);
String money = cursor.getString(2);
System.out.println("id="+id+"; name="+name+"; money="+money);
}
cursor.close();
}
public void delete(View view) {
db.execSQL("delete from account where name=?",new String[]{"liufeng"});
}
}
04_数据库的另外一种增删改查方法(重点)
代码:
DBHelper.java:
package com.itheima.db;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
/**
*
* @param context
* 上下午对象
* @param name
* 数据库的名称
* @param factory
* 游标工厂 ,null表示使用系统默认的游标工厂
* @param version
* 数据库的版本号,最小为1,升级时版本号应该增加
*/
public DBHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
// public DBHelper(Context context) {
// super(context, name, factory, version);
// }
/**
* 初始化数据库实例时调用这个方法 创建表结构,添加初始数据记录
*
* db:数据库实例对象
*/
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println("======onCreate============");
String sql = "create table account (_id integer primary key autoincrement,name varchar(20),money varchar(20))";
// 创建表结构
db.execSQL(sql);
}
public void insert(SQLiteDatabase db, String table, ContentValues values) {
// //使用类似map的数据结构存储数据
// ContentValues values = new ContentValues();
// values.put("name", "liufeng");
// values.put("money", "1000000");
// 插入数据
db.insert("account", null, values);
// 如果不关闭,数据库连接会一直存在导致内存不够用或者数据库被锁定
db.close();
}
public void update(SQLiteDatabase db, String table, ContentValues values,
String whereClause, String[] whereArgs) {
// //使用类似map的数据结构存储数据
// ContentValues values = new ContentValues();
// values.put("name", "liufeng");
// values.put("money", "1000000");
// 插入数据
db.update(table, values, whereClause, whereArgs);
// 如果不关闭,数据库连接会一直存在导致内存不够用或者数据库被锁定
db.close();
}
public Cursor query(SQLiteDatabase db, String table, String[] columns,
String selection, String[] selectionArgs, String groupBy,
String having, String orderBy) {
Cursor cursor = db.query(table, columns, selection, selectionArgs,
groupBy, having, orderBy);
return cursor;
}
public void delete(SQLiteDatabase db, String table, String whereClause,
String[] whereArgs) {
db.delete(table, whereClause, whereArgs);
db.close();
}
/**
* 升级数据库时调用这个方法
*
* 修改表结构,升级数据库
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("======onUpgrade============");
}
}
MainActivity.java:
package com.itheima.db;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
private SQLiteDatabase db;
private DBHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
helper = new DBHelper(this, "itheima.db", null, 1);
db = helper.getWritableDatabase();
}
public void insert(View view) {
// 使用类似map的数据结构存储数据
ContentValues values = new ContentValues();
values.put("name", "liufeng");
values.put("money", "1000000");
helper.insert(db, "account", values);
}
public void update(View view) {
// db.execSQL("update account set money = ‘10000000‘ where name=‘liufeng‘");
ContentValues values = new ContentValues();
values.put("money", "10000000");
helper.update(db, "account", values, "name=?",
new String[] { "liufeng" });
}
public void query(View view) {
// 查询数据库返回一个结果集
Cursor cursor = helper.query(db, "account", new String[] { "name",
"money" }, "name=?", new String[] { "liufeng" }, null, null,
null);
while (cursor.moveToNext()) {
String name = cursor.getString(0);
String money = cursor.getString(1);
System.out.println(" name=" + name + "; money="
+ money);
}
cursor.close();
}
public void delete(View view) {
helper.delete(db, "account", "name=?", new String[]{"liufeng"});
}
}
05_命令行查看数据库
使用SQLite的命令查看远程设备上的数据库;
06_数据库的事务(重点)
事务:一组数据库操作要么同时成功要么同时失败;
从liufeng账户转出100万,给panxu;
liufeng-1000000
panxu+1000000
示例:
public void trans() {
// //使用类似map的数据结构存储数据
// ContentValues values = new ContentValues();
// values.put("name", "liufeng");
// values.put("money", "1000000");
// 插入数据
SQLiteDatabase db = this.getWritableDatabase();
try {
//开启事务
db.beginTransaction();
ContentValues values = new ContentValues();
values.put("money", "9900000");
db.update("account", values, "name=?", new String[]{"liufeng"});
ContentValues values02 = new ContentValues();
values02.put("money", "100100");
db.update("account", values, "name=?", new String[]{"panxu"});
//告诉数据库事务提交成功
db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
}finally{
//结束事务
db.endTransaction();
}
// 如果不关闭,数据库连接会一直存在导致内存不够用或者数据库被锁定
db.close();
}
07_listview的使用(重点)
listview在界面上显示一个列表;
步骤:
1、在布局文件上添加listView控件;
2、添加一个item的布局文件;
3、在代码中给listview填充数据;
布局文件:
activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv" />
</RelativeLayout>
item.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="20sp" >
</TextView>
MainActivity
package com.itheima.listview;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new ArrayAdapter(this, R.layout.item, new String[]{"张柏芝","谢霆锋","王菲"}));
}
}
08_ArrayAdapter
使用ArrayAdapter显示简单的数据的步骤:
1、在布局文件上添加listView控件;
2、添加一个item的布局文件;
3、在代码中给listview填充数据;
代码:
activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv" />
</RelativeLayout>
item.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="20sp" >
</TextView>
MainActivity.java:
package com.itheima.listview;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
//给listview填充数据
lv.setAdapter(new ArrayAdapter(this, R.layout.item, new String[]{"张柏芝","谢霆锋","王菲"}));
}
}
09_SimpleAdapter
步骤:
1、在布局文件上添加listView控件;
2、添加一个item的布局文件;
3、在代码中给listview填充数据;
代码:
item.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:layout_width="50dip"
android:layout_height="wrap_content"
android:id="@+id/tv_id"
android:text="1"
android:textSize="20sp"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_name"
android:text="dsfds"
android:textSize="20sp"
/>
</LinearLayout>
MainActivity.java:
package com.itheima.listview;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends Activity {
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
//准备数据list
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map = new HashMap<String, String>();
map.put("id", "1");
map.put("name", "张柏芝");
Map<String, String> map2 = new HashMap<String, String>();
map2.put("id", "2");
map2.put("name", "王菲");
list.add(map);
list.add(map2);
//填充数据
//this 上下文对象
//list 需要显示的数据
//R.layout.item 显示条目的布局文件的资源ID
//from 需要显示的列
//在哪些控件上显示对应的列
lv.setAdapter(new SimpleAdapter(this, list, R.layout.item,
new String[] { "id", "name" }, new int[] { R.id.tv_id,
R.id.tv_name }));
}
}
10_复杂listview界面的显示(重点)
listview的工作原理:
每显示一个条目,就调用getView方法得到对应的试图对象;当屏蔽掉一个条目时,就会销毁内存中条目对象的试图对象。
步骤:
1、在布局文件上添加listview控件;
2、设计item的布局文件;
3、在代码中声明和初始化listview控件;
4、自定义一个数据适配器,继承BaseAdapter,实现getCount和getView两个方法;
5、使用自定义的数据适配器填充数据;
代码:
布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ImageView
android:layout_width="80dip"
android:layout_height="80dip"
android:id="@+id/iv_image"
android:src="@drawable/ic_launcher"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_title"
android:singleLine="true"
android:layout_toRightOf="@id/iv_image"
android:text="新闻标题新闻标题新闻标题新闻标题新闻标题新闻标题新闻标题"
android:textSize="16sp"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_desc"
android:maxLines="4"
android:layout_below="@id/tv_title"
android:textSize="12sp"
android:layout_toRightOf="@id/iv_image"
android:text="描述描述描述描述描述描述描述述描述描述述描述描述述描述描述述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述"
/>
</RelativeLayout>
MainActivity
package com.itheima.newslistview;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.itheima.newslistview.domain.NewsItem;
import com.itheima.newslistview.service.NewsItemParseService;
public class MainActivity extends Activity {
private ListView lv;
private List<NewsItem> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
list = NewsItemParseService.parseNewsItems();
//使用自定的数据适配器填充数据
lv.setAdapter(new MyAdapter());
}
//自顶一个数据适配器
private class MyAdapter extends BaseAdapter{
/**
* 统计listview显示多个条目
*/
@Override
public int getCount() {
return list.size();
}
/**
* 得到item界面对应的试图对象
* position item的位置
* convertView 可以重复使用的view对象,优化listview
* parent 父级控件 listview 通常使用null
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
if(convertView != null){
view = convertView;
}else{
//加载item的布局文件,并且转换成视图对象
view = View.inflate(MainActivity.this, R.layout.item, null);
}
//得到视图对象中的控件
ImageView image = (ImageView) view.findViewById(R.id.iv_image);
TextView tv_title = (TextView) view.findViewById(R.id.tv_title);
TextView tv_desc = (TextView) view.findViewById(R.id.tv_desc);
//得到新闻条目的数据
NewsItem item = list.get(position);
//给item的视图填充数据
tv_title.setText(item.getTitle());
tv_desc.setText(item.getDescription());
// 返回item试图对象
return view;
}
/**
* 根据指定的位置的条目
*/
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
/**
* 根据指定的位置的条目的ID
*/
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
}
}
NewsItemParseService
package com.itheima.newslistview.service;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.os.Environment;
import android.util.Xml;
import com.itheima.newslistview.domain.NewsItem;
public class NewsItemParseService {
public static List<NewsItem> parseNewsItems(){
List<NewsItem> list = new ArrayList<NewsItem>();
try {
// 得到pull解析器
XmlPullParser parser = Xml.newPullParser();
// 初始化解析器
File file = new File(Environment.getExternalStorageDirectory()
+ "/news.xml");
FileInputStream fis = new FileInputStream(file);
parser.setInput(fis, "UTF-8");
// 得到解析的事件类型
int type = parser.getEventType();
NewsItem item = null;
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG://解析到开始标签位置
if ("item".equals(parser.getName())) {//获得标签的名称
System.out.println("....item........");
item = new NewsItem();
} else if ("title".equals(parser.getName())) {
//获得标签体的内容
String title = parser.nextText();
System.out.println("title:" + title);
item.setTitle(title);
} else if ("description".equals(parser.getName())) {
String description = parser.nextText();
System.out.println("description:" + description);
item.setDescription(description);
}else if ("image".equals(parser.getName())) {
String image = parser.nextText();
System.out.println("image:" + image);
item.setImage(image);
}else if ("type".equals(parser.getName())) {
String newstype = parser.nextText();
System.out.println("type:" + newstype);
item.setType(newstype);
}else if ("comment".equals(parser.getName())) {
String comment = parser.nextText();
System.out.println("comment:" + comment);
item.setComment(comment);
}
break;
case XmlPullParser.END_TAG://解析到标签的结束位置
if ("item".equals(parser.getName())) {
System.out.println("..../ item........"+item);
list.add(item);
item = null;
}
break;
}
// 解析下一个标签
type = parser.next();
}
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}
11_数据库listview界面的显示
代码:
package com.itheima.querytolistview;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import android.accounts.Account;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
private ListView lv;
private DBHelper helper;
private SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
helper = new DBHelper(this, "itheima.db", null, 1);
db = helper.getWritableDatabase();
}
public void insert(View view){
Random r = new Random();
for(int i=0; i< 100; i++){
ContentValues values = new ContentValues();
values.put("name", "name"+r.nextInt(1000));
values.put("money", ""+r.nextInt(1000));
helper.insert(db, "account", values);
}
}
public void query(View view){
List<Person> list = new ArrayList<Person>();
Cursor cursor = helper.query(db, "account", new String[]{"name","money"}, null, null, null, null, null);
while(cursor.moveToNext()){
Person p = new Person();
String name = cursor.getString(0);
String money = cursor.getString(1);
p.setMoney(money);
p.setName(name);
list.add(p);
}
lv.setAdapter(new ArrayAdapter(this, R.layout.item, list));
}
}
12_对话框合集
1、Toast
2、确定取消按钮
3、单选对话框
4、复选对话框
5、进度对话框
6.进度条对话框
前三种对话框:
代码:
package com.itheima.dialog;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click01(View view){
//得到对话框的构造器,可以构造对话的模版
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("提醒:");
builder.setMessage("若练此功,必先自宫");
//添加一个确定按钮
builder.setPositiveButton("确定自宫", new OnClickListener() {
/**
* 点击确定按钮时调用这个方法
* 当前对话框
*/
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "即使自宫也未必成功", 0).show();
}
});
//添加一个取消按钮
builder.setNegativeButton("想想再说", new OnClickListener() {
/**
* 点击取消按钮时调用这个方法
* 当前对话框
*/
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "若不自宫,肯定不会成功", 0).show();
}
});
//使用构造器创建一个对话框的对象
AlertDialog ad = builder.create();
//显示对话框
ad.show();
}
public void click02(View view){
//得到对话框的构造器,可以构造对话的模版
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("请选择:");
final String[] items = new String[]{"男","女","其他"};
builder.setSingleChoiceItems(items, 0, new OnClickListener() {
/**
* 点击单选项时调用这个方法
* 当前对话框
*/
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "你选择了性别"+items[which], 0).show();
}
});
//添加一个确定按钮
builder.setPositiveButton("提交", new OnClickListener() {
/**
* 点击确定按钮时调用这个方法
* dialog 当前对话框
*/
@Override
public void onClick(DialogInterface dialog, int which) {
//关闭当前对话框
dialog.dismiss();
}
});
// //添加一个取消按钮
// builder.setNegativeButton("想想再说", new OnClickListener() {
// /**
// * 点击取消按钮时调用这个方法
// * 当前对话框
// */
// @Override
// public void onClick(DialogInterface dialog, int which) {
// Toast.makeText(MainActivity.this, "若不自宫,肯定不会成功", 0).show();
// }
// });
//
//使用构造器创建一个对话框的对象
AlertDialog ad = builder.create();
//显示对话框
ad.show();
}
public void click03(View view){
//得到对话框的构造器,可以构造对话的模版
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("请选择:");
final String[] items = new String[]{"苹果","栗子","梨","芒果","西瓜"};
boolean[] checkedItems = new boolean[]{true,false,true,false,false};
builder.setMultiChoiceItems(items, checkedItems, new OnMultiChoiceClickListener() {
//dialog 当前对话框
//which当前选择的那个选项
//isChecked 当前选项是否被选中
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if(isChecked){
Toast.makeText(MainActivity.this, items[which], 0).show();
}
}
});
//添加一个确定按钮
builder.setPositiveButton("提交", new OnClickListener() {
/**
* 点击确定按钮时调用这个方法
* dialog 当前对话框
*/
@Override
public void onClick(DialogInterface dialog, int which) {
//关闭当前对话框
dialog.dismiss();
}
});
//使用构造器创建一个对话框的对象
AlertDialog ad = builder.create();
//显示对话框
ad.show();
}
}
进度、进度条对话框:
package com.itheima.dialog;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click01(View view){
//得到对话框的构造器,可以构造对话的模版
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("提醒:");
builder.setMessage("若练此功,必先自宫");
//添加一个确定按钮
builder.setPositiveButton("确定自宫", new OnClickListener() {
/**
* 点击确定按钮时调用这个方法
* 当前对话框
*/
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "即使自宫也未必成功", 0).show();
}
});
//添加一个取消按钮
builder.setNegativeButton("想想再说", new OnClickListener() {
/**
* 点击取消按钮时调用这个方法
* 当前对话框
*/
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "若不自宫,肯定不会成功", 0).show();
}
});
//使用构造器创建一个对话框的对象
AlertDialog ad = builder.create();
//显示对话框
ad.show();
}
public void click02(View view){
//得到对话框的构造器,可以构造对话的模版
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("请选择:");
final String[] items = new String[]{"男","女","其他"};
builder.setSingleChoiceItems(items, 0, new OnClickListener() {
/**
* 点击单选项时调用这个方法
* 当前对话框
*/
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "你选择了性别"+items[which], 0).show();
}
});
//添加一个确定按钮
builder.setPositiveButton("提交", new OnClickListener() {
/**
* 点击确定按钮时调用这个方法
* dialog 当前对话框
*/
@Override
public void onClick(DialogInterface dialog, int which) {
//关闭当前对话框
dialog.dismiss();
}
});
// //添加一个取消按钮
// builder.setNegativeButton("想想再说", new OnClickListener() {
// /**
// * 点击取消按钮时调用这个方法
// * 当前对话框
// */
// @Override
// public void onClick(DialogInterface dialog, int which) {
// Toast.makeText(MainActivity.this, "若不自宫,肯定不会成功", 0).show();
// }
// });
//
//使用构造器创建一个对话框的对象
AlertDialog ad = builder.create();
//显示对话框
ad.show();
}
public void click03(View view){
//得到对话框的构造器,可以构造对话的模版
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("请选择:");
final String[] items = new String[]{"苹果","栗子","梨","芒果","西瓜"};
boolean[] checkedItems = new boolean[]{true,false,true,false,false};
builder.setMultiChoiceItems(items, checkedItems, new OnMultiChoiceClickListener() {
//dialog 当前对话框
//which当前选择的那个选项
//isChecked 当前选项是否被选中
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if(isChecked){
Toast.makeText(MainActivity.this, items[which], 0).show();
}
}
});
//添加一个确定按钮
builder.setPositiveButton("提交", new OnClickListener() {
/**
* 点击确定按钮时调用这个方法
* dialog 当前对话框
*/
@Override
public void onClick(DialogInterface dialog, int which) {
//关闭当前对话框
dialog.dismiss();
}
});
//使用构造器创建一个对话框的对象
AlertDialog ad = builder.create();
//显示对话框
ad.show();
}
public void click04(View view){
final ProgressDialog pd = new ProgressDialog(this);
pd.setTitle("提醒");
pd.setMessage("请稍等...");
pd.show();
new Thread(){
public void run() {
for(int i=0; i<10;i++){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
pd.dismiss();
};
}.start();
}
public void click05(View view){
final ProgressDialog pd = new ProgressDialog(this);
//设置进度条的样式
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setTitle("提醒");
pd.setMessage("请稍等...");
pd.setMax(100);
pd.show();
//会阻塞主线程
// for(int i=0; i<100;i++){
// try {
// Thread.sleep(30);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// pd.setProgress(i);
// }
//
new Thread(){
public void run() {
for(int i=0; i<100;i++){
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
pd.setProgress(i);
}
pd.dismiss();
};
}.start();
}
}
13_帧动画(重点)
FrameAnimation,DrawableAnimation
帧动画的概念:
加载一组有序的图片,然后一帧一帧的去播放,这个变化过程就是帧动画;
参考开发文档实现代码:
girl.xml:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false"
>
<item
android:drawable="@drawable/girl_1"
android:duration="200"/>
<item
android:drawable="@drawable/girl_2"
android:duration="200"/>
<item
android:drawable="@drawable/girl_3"
android:duration="200"/>
<item
android:drawable="@drawable/girl_4"
android:duration="200"/>
<item
android:drawable="@drawable/girl_5"
android:duration="200"/>
<item
android:drawable="@drawable/girl_6"
android:duration="200"/>
<item
android:drawable="@drawable/girl_7"
android:duration="200"/>
<item
android:drawable="@drawable/girl_6"
android:duration="200"/>
<item
android:drawable="@drawable/girl_7"
android:duration="200"/>
<item
android:drawable="@drawable/girl_6"
android:duration="200"/>
<item
android:drawable="@drawable/girl_7"
android:duration="200"/>
<item
android:drawable="@drawable/girl_8"
android:duration="200"/>
<item
android:drawable="@drawable/girl_9"
android:duration="200"/>
<item
android:drawable="@drawable/girl_10"
android:duration="200"/>
<item
android:drawable="@drawable/girl_11"
android:duration="200"/>
</animation-list>
MainActivity.java:
package com.itheima.drawableanima;
import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
//给imageView添加背景资源
iv.setBackgroundResource(R.drawable.girl);
//得到动画资源
AnimationDrawable ad = (AnimationDrawable) iv.getBackground();
//播放动画
ad.start();
}
}