Android基础-03

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();
}
}
时间: 2024-10-01 03:01:44

Android基础-03的相关文章

Android基础01 快速入门 &amp; 布局

Android基础01 快速入门 & 布局 01.01  手机制式 第一代模拟制式手机(1G):1G就是大哥大,手机类似于简单的无线电双工电台,通话是锁定在一定频率,所以使用可调频电台就可以窃听通话.   第二代GSM.CDMA等数字手机(2G):手机使用PHS,GSM或者CDMA这些十分成熟的标准,具有稳定的通话质量和合适的待机时间,支持彩信业务的GPRS和上网业务的WAP服务,以及各式各样的Java程序等. 第三代移动通信技术(3G):3G,是英文3rd Generation的缩写,指第三代

Android基础-05

Android基础-05 网络编程2 01_post方式提交数据的中文乱码解决(重点) Android应用程序中默认是的字符集编码是UTF-8. java.io.IOException: exceeded content-length limit of 29 bytes 在代码中对中文进行URL编码: String data = "username="+URLEncoder.encode(username,"UTF-8")+"&password=&

Android基础-07

Android基础-07 广播与服务 01_为什么需要广播接受者 电台:中央人民广播电台,93.4mhz: 收音机:93.4mhz,收听广播: Android系统内置的电台,发送一些事件:接收短信.外拨电话.电量不足.电量充满.SD插拔.软件安装与下载等. Android应用程序中的收音机:广播接收者,指定需要接收的事件类型: 可以做一些对用户有用的业务逻辑操作. 广播接收者的特点: 1.即使广播接收者没有运行,当广播事件到达的时候,系统会自动启动广播接收者,并且调用onReceive方法处理消

Android基础知识点总结

Android基础知识点总结 在学习了很长一段时间的Android基础内容,如果不做及时的复习,那么后面的项目学习起来可能就没那么顺利了,并且复习也是一件很愉快的事.古人有云:"学而时习之不亦说乎",应该就是这个道理. ~本文大纲~ Android基础知识点总结 Day01 01Android系统中我们常用的4种数据存储方式 02获取手机内存空间大小 03XML文件的生成和解析 GET新技能 Day02 SQLiteOpenHelper的基本用法 数据库事务 Listview的简单优化

Android逆向-Android基础逆向(2-2)

[toc] #0x00 前言##不知所以然,请看Android逆向-Android基础逆向(1)Android逆向-Android基础逆向(2)##以及java系列:Android逆向-java代码基础(1)Android逆向-java代码基础(2)Android逆向-java代码基础(3)Android逆向-java代码基础(4)Android逆向-java代码基础(5)Android逆向-java代码基础(6)Android逆向-java代码基础(7)Android逆向-java代码基础(8

Android基础入门教程——10.12 传感器专题(3)——加速度-陀螺仪传感器

Android基础入门教程--10.12 传感器专题(3)--加速度/陀螺仪传感器 标签(空格分隔): Android基础入门教程 本节引言: 本节继续来扣Android中的传感器,本节带来的是加速度传感器(Accelerometer sensor)以及 陀螺仪传感器(Gyroscope sensor),和上一节的方向传感器一样有着x,y,z 三个轴, 还是要说一点:x,y轴的坐标要和绘图那里的x,y轴区分开来!传感器的是以左下角 为原点的!x向右,y向上!好的,带着我们的套路来学本节的传感器吧

Android基础入门教程——8.1.3 Android中的13种Drawable小结 Part 3

Android基础入门教程--8.1.3 Android中的13种Drawable小结 Part 3 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 层图形对象,包含一个Drawable数组,然后按照数组对应的顺序来

Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

Android基础入门教程--8.1.2 Android中的13种Drawable小结 Part 2 标签(空格分隔): Android基础入门教程 本节引言: 本节我们继续来学习Android中的Drawable资源,上一节我们学习了: ColorDrawable:NinePatchDrawable: ShapeDrawable:GradientDrawable!这四个Drawable~ 而本节我们继续来学习接下来的五个Drawable,他们分别是: BitmapDrawable:Insert

Android基础入门教程——2.3.12 Date &amp; Time组件(下)

Android基础入门教程--2.3.12 Date & Time组件(下) 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来继续学习Android系统给我们提供的几个原生的Date & Time组件,他们分别是: DatePicker(日期选择器),TimePicker(时间选择器),CalendarView(日期视图),好吧, 其实一开始让我扣这几个玩意我是拒绝的,因为在我的印象里,他们是这样的: 简直把我丑哭了,有木有,终于知道为什么那么多人喜欢自定义这种类型的