Android快速开发
来源:互联网 发布:阿里云备案订单号查询 编辑:程序博客网 时间:2024/06/08 09:35
在这里,你只需要复制、粘贴和稍微加一点修改即可。适用于有Android基础的同学,并且又不愿意做重复工作的同学
- 涉及到的点有
- 从字符XML中拿数组
- ListView适配器
- 去除标题栏
- 发送消息到通知栏
- 使用Intent 传递对象
- Spinner控件
- 具体项目的DBHelper
- 具体项目的DB
- 全屏模式
- 圆角按钮实现
- 实现按钮被点击的效果
- 覆写系统方法
- 知晓当前活动
- 活动管理器
- 自定义控件
- 网络监测
- 数据持久化方案
- SQLiteDatabase事务
- 自定义内容提供器
- SurfaceView 的基本框架
1.学习安卓的以前都学过web开发
2.
// 从字符XML中拿数组String[] apps = getResources().getStringArray(R.array.apps);
3.
// ListView适配器 class ListViewAdapter extends BaseAdapter { @Override public int getCount() { return appList.size(); } @Override public App getItem(int position) { return appList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { // 获取ListViewItem的布局 convertView = View.inflate(MainActivity.this,R.layout.activity_main_item, null); holder = new ViewHolder(); // 获取子项中的具体布局 holder.image = (ImageView) convertView.findViewById(R.id.iv_list); holder.text = (TextView) convertView.findViewById(R.id.tv_list); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 设置相关信息 holder.image.setImageResource(appList.get(position).getPicId()); holder.text.setText(appList.get(position).getAppName()); return convertView; } class ViewHolder { private ImageView image; private TextView text; } }
4.去除标题栏
(1)requestWindowFeature(Window.FEATURE_NO_TITLE);(2)在values文件夹下面的styles.xml文件中添加一个样式:<style name="notitle"> <item name="android:windowNoTitle">true</item> </style>然后在AndroidManifest.xml文件中的<application>标签中添加一个android:theme 属性即可.例如:<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/notitle" >
5.发送消息到通知栏
//启动目标Activity的Intent对象 Intent intent = new Intent(UserActivity.this, Welcome.class); //pengding: 即将 PendingIntent pendIntent =PendingIntent.getActivity(UserActivity.this, 0, intent, 0); //实例化通知实例 Notification notif= new Notification(R.drawable.welcome, "Hello,Lady or Gentleman!!Click me!!",System.currentTimeMillis()); notif.defaults=Notification.DEFAULT_SOUND;//声音 //拉开之后显示的信息 notif.setLatestEventInfo(UserActivity.this, "Hello", "Hello,Thank you for using app", pendIntent); //通知管理器 管理通知 NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); //发送通知 manager.notify(1, notif);
6.使用Intent 传递对象
//传递 Intent intent = new Intent(); intent.setClass(UserActivity.this,UserInfo.class); Bundle bundle = new Bundle(); bundle.putSerializable("user", user); intent.putExtras(bundle); this.startActivity(intent);
7.Spinner控件
//当点击登录时才会获取,所以不用放在选项改变的方法中,不用时刻检测,只需要在点击登录时获取就好 String loc = spLoc.getSelectedItem().toString();
8.具体项目的DBHelper
public class CoolWeatherOpenHelper extends SQLiteOpenHelper { /** * Province建表语句 */ public static final String CREATE_PROVINCE="create table Province (" + "id integer primary key autoincrement," + "province_name text," + "province_code text)"; /** * City建表语句 */ public static final String CREATE_CITY="create table City (" + "id integer primary key autoincrement," + "city_name text," + "city_code text," + "province_id integer)"; /** * County建表语句 */ public static final String CREATE_COUNTY="create table County (" + "id integer primary key autoincrement," + "county_name text," + "county_code text," + "city_id integer)"; public CoolWeatherOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_PROVINCE);//创建Province表 db.execSQL(CREATE_CITY);//创建City表 db.execSQL(CREATE_COUNTY);//创建County表 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub }}
9.具体项目的DB
public class CoolWeatherDB { /** * 数据库名 */ public static final String DB_NAME="cool_weather"; /** * 数据库版本 */ public static final int VERSION=1; private static CoolWeatherDB coolWeatherDB;//采用单例模式 private SQLiteDatabase db; /** * 将构造方法私有化 */ private CoolWeatherDB(Context context){ CoolWeatherOpenHelper dbHelper = new CoolWeatherOpenHelper(context, DB_NAME, null, VERSION); db = dbHelper.getWritableDatabase(); } /** * 获取CoolWeatherDB的实例 */ public synchronized static CoolWeatherDB getInstance(Context context){ if(coolWeatherDB == null){ coolWeatherDB = new CoolWeatherDB(context); } return coolWeatherDB; } /** * 将Province实例存储到数据库 */ public void saveProvince(Province province){ if(province != null){ ContentValues values = new ContentValues(); values.put("province_name", province.getProvinceName()); values.put("province_code", province.getProvinceCode()); db.insert("Province", null, values); } } /** * 从数据库读取全国所有的省份信息 */ public List<Province> loadProvinces(){ List<Province> list = new ArrayList<Province>(); Cursor cursor =db.query("Province", null, null, null, null, null, null); if(cursor.moveToFirst()){ do{ Province province = new Province(); province.setId(cursor.getInt(cursor.getColumnIndex("id"))); province.setProvinceName(cursor.getString(cursor.getColumnIndex("province_name"))); province.setProvinceCode(cursor.getString(cursor.getColumnIndex("province_code"))); list.add(province); }while(cursor.moveToNext()); if(cursor != null){ cursor.close(); } } if(cursor != null){ cursor.close(); } return list; }}
10.全屏模式(但是标题栏还在,标题栏可去)
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
11.圆角按钮实现:
首先写一个XML,专门处理按钮图形的,比如叫做shape.xml,就先放在drawable文件夹下面吧.shape.xml:<?xml version="1.0" encoding="UTF-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!-- 填充的颜色 --> <solid android:color="#FFFFFF" /> <!-- 设置按钮的四个角为弧形 --> <!-- android:radius 弧形的半径 --> <corners android:radius="5dip" /><!-- padding:Button里面的文字与Button边界的间隔 --><padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp"/></shape>接下来,在布局文件中引用就OK 了.<Button ....... android:background="@drawable/shape" />
12.实现按钮被点击的效果
首先写btn_selector.xml文件<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="false" android:drawable="@drawable/coolweather"/> <item android:state_pressed="true" android:drawable="@drawable/fiftyfour_backgroun"/></selector>在布局文件中.<Button ....... android:background="@drawable/btn_selector" />
13.如果在覆写系统方法的时候,报这个错误:
08-25 10:36:28.234: E/AndroidRuntime(5066):java.lang.RuntimeException:Unable to resume activity {com.example.androidvideoplay/com.example.androidvideoplay.MainActivity}: android.app.SuperNotCalledException: Activity {com.example.androidvideoplay/com.example.androidvideoplay.MainActivity} did not call through to super.onResume()原因在红色字体,已经很清楚的告诉你了,你没有调用系统的super.相应的方法
14.当SurfaceView所在的Activity离开了前台之后,SurfaceView会被摧毁,当Activity有重新回到前台时,SurfaceView会被重新创建,创建是在onResume()方法之后
15.知晓当前是哪一个活动,让此活动成为其他活动的父类
/*** 技巧:知晓当前是哪一个活动,让此活动成为其他活动的父类 FirstActivity extends BaseActivity 、FirstActivity extends BaseActivity ......*/public class BaseActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i("BaseActivity",getClass().getSimpleName()); setContentView(R.layout.activity_base); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_base, menu); return true; }}
16.
/***类描述: 活动管理器*/public class ActivityCollector { public static List<Activity> activities = new ArrayList<Activity>(); public static void addActivity(Activity activity){ activities.add(activity); } public static void removeActivity(Activity activity){ activities.remove(activity); } public static void finishAll(){ for(Activity activity : activities){ if(!activity.isFinishing()){ activity.finish(); } } }}
17.创建自定义控件
/**** 类描述:自定义的标题控件*/public class TitleLayout extends LinearLayout { public TitleLayout(Context context, AttributeSet attrs) { super(context, attrs); // 动态加载布局文件 LayoutInflater.from(context).inflate(R.layout.title, this); // 设定按钮监听事件 findViewById(R.id.title_back).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //结束当前的Activity ((Activity) getContext()).finish(); } }); findViewById(R.id.title_edit).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //在自定义控件里面错误的写法:Toast.makeText(this, "编辑按钮", Toast.LENGTH_LONG).show(); Toast.makeText(getContext(), "编辑按钮", Toast.LENGTH_LONG).show(); } }); }}
18.监测网络是否可用
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if(networkInfo != null && networkInfo.isAvailable()){ Toast.makeText(context, "网络可用", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(context, "网络不可用", Toast.LENGTH_SHORT).show(); }需要在配置文件当中加入相应的权限:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
19.数据持久化方案
a)使用文件
i.将数据存储到文件中
String fileName = "usefile.txt"; String content = "我是要存储的字符串"; try { FileOutputStream fos = openFileOutput(fileName, Context.MODE_PRIVATE); fos.write(content.getBytes()); fos.close(); } catch (IOException e) { e.printStackTrace(); }
ii.从文件中读取数据
String content = null; try { String fileName = "usefile.txt"; FileInputStream fis = openFileInput(fileName); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = fis.read(buffer)) != -1) { baos.write(buffer, 0, len); } content = baos.toString(); Toast.makeText(MainActivity.this, content, Toast.LENGTH_LONG).show(); fis.close(); baos.close(); } catch (Exception e) { e.printStackTrace(); }
b) SharedPreferences存储
i.获取 SharedPreferences 对象的三种方式
1).Context的getSharedPreferences();
2).Activity的getPreferences();
3).PreferenceManager 的 getDefaultSharedPreferences();
Demo:
存数据:
SharedPreferences sharedPreferences = getSharedPreferences("data",MODE_PRIVATE); Editor edit = sharedPreferences.edit(); edit.putString("name", "杨润康"); edit.putInt("age", 20); edit.commit();
读取数据:
SharedPreferences sharedPreferences = getSharedPreferences("data",MODE_PRIVATE); String name = sharedPreferences.getString("name", "null"); int age = sharedPreferences.getInt("age", 0);Toast.makeText(MainActivity.this, name+age, Toast.LENGTH_LONG).show();
20.SQLiteDatabase使用事务[简单点,就是加三行事务的代码,其余的都一样]
SQLiteDatabase db = databaseHelper.getReadableDatabase(); db.beginTransaction();//开启事务 try { db.delete("Book", null, null);//第一个操作 /*if(true){//模拟故障,手动抛出异常 throw new NullPointerException(); }*/ ContentValues values = new ContentValues(); values.put("author", "blatran"); values.put("price", "300"); values.put("pages", "199"); values.put("name", "yangrunkangtran"); db.insert("Book", null, values);//第二个操作 db.setTransactionSuccessful();//事务已经执行成功 } catch (Exception e) { e.printStackTrace(); }finally{ db.endTransaction();//结束事务 }
21.完整的自定义内容提供器
/*** 类描述:自定义的内容提供者*/public class MyProvider extends ContentProvider { public static final int TABLE1_DIR = 0; public static final int TABLE1_ITEM = 1; public static final int TABLE2_DIR = 2; public static final int TABLE2_ITEM = 3; public static UriMatcher uriMatcher; static { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI("com.android_3200_contentresolver.provider", "table1", TABLE1_DIR); uriMatcher.addURI("com.android_3200_contentresolver.provider", "table1/#", TABLE1_ITEM); uriMatcher.addURI("com.android_3200_contentresolver.provider", "table2", TABLE2_DIR); uriMatcher.addURI("com.android_3200_contentresolver.provider", "table2/#", TABLE2_ITEM); } @Override public boolean onCreate() { return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { switch (uriMatcher.match(uri)) { case TABLE1_DIR: //查询table1表中的所有数据 break; case TABLE1_ITEM: //查询table1表中的单条数据 break; case TABLE2_DIR: //查询table2表中的所有数据 break; case TABLE2_ITEM: //查询table2表中的单条数据 break; default: break; } return null; } @Override public String getType(Uri uri) { switch (uriMatcher.match(uri)) { case TABLE1_DIR: //查询table1表中的所有数据 return "vnd.android.cursor.dir/vnd.com.android_3200_contentresolver.provider.table1"; case TABLE1_ITEM: //查询table1表中的单条数据 return "vnd.android.cursor.item/vnd.com.android_3200_contentresolver.provider.table1"; case TABLE2_DIR: //查询table2表中的所有数据 return "vnd.android.cursor.dir/vnd.com.android_3200_contentresolver.provider.table2"; case TABLE2_ITEM: //查询table2表中的单条数据 return "vnd.android.cursor.item/vnd.com.android_3200_contentresolver.provider.table2"; default: break; } return null; } @Override public Uri insert(Uri uri, ContentValues values) { return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; }}
内容提供器的具体案例
public class DatabaseProvider extends ContentProvider { public static final int BOOK_DIR = 0; public static final int BOOK_ITEM = 1; public static final int CATEGORY_DIR = 2; public static final int CATEGORY_ITEM = 3; private static final String AUTHORITY = "com.android_3100_androidpersistence.provider"; public static UriMatcher uriMatcher; private MyDatabaseHelper dbHelper; static { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(AUTHORITY, "bool", BOOK_DIR); uriMatcher.addURI(AUTHORITY, "book/#", BOOK_ITEM); uriMatcher.addURI(AUTHORITY, "category", CATEGORY_DIR); uriMatcher.addURI(AUTHORITY, "category/#", CATEGORY_ITEM); } @Override public boolean onCreate() { dbHelper = new MyDatabaseHelper(getContext(), "BookStore.db", null, 2); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // 查询数据 SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor query = null; switch (uriMatcher.match(uri)) { case BOOK_DIR: query = db.query("Book", null, null, null, null, null, null); break; case BOOK_ITEM: String bookId = uri.getPathSegments().get(1); query = db.query("Book", null, "id=?", new String[] { bookId },null, null, sortOrder); break; case CATEGORY_DIR: query = db.query("Category", null, null, null, null, null, null); break; case CATEGORY_ITEM: String categoryId = uri.getPathSegments().get(1); query = db.query("Category", null, "id=?",new String[] { categoryId }, null, null, sortOrder); break; default: break; } return query; } @Override public String getType(Uri uri) { switch (uriMatcher.match(uri)) { case BOOK_DIR: return "vnd.android.cursor.dir/vnd."+AUTHORITY+".book"; case BOOK_ITEM: return "vnd.android.cursor.item/vnd."+AUTHORITY+".book"; case CATEGORY_DIR: return "vnd.android.cursor.dir/vnd."+AUTHORITY+".category"; case CATEGORY_ITEM: return "vnd.android.cursor.item/vnd."+AUTHORITY+".category"; } return null; } @Override public Uri insert(Uri uri, ContentValues values) { // 添加数据 SQLiteDatabase db = dbHelper.getReadableDatabase(); Uri uriReturn = null; switch (uriMatcher.match(uri)) { case BOOK_DIR: case BOOK_ITEM: long newBookId = db.insert("Book", null, values); uriReturn = Uri.parse("content://" + AUTHORITY + "/book/"+ newBookId); break; case CATEGORY_DIR: case CATEGORY_ITEM: long newCategoryId = db.insert("Category", null, values); uriReturn = Uri.parse("content://" + AUTHORITY + "/category/"+ newCategoryId); break; default: break; } return uriReturn; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // 删除数据 SQLiteDatabase db = dbHelper.getReadableDatabase(); int deleteRows = 0; switch (uriMatcher.match(uri)) { case BOOK_DIR: deleteRows = db.delete("Book", selection, selectionArgs); break; case BOOK_ITEM: String bookId = uri.getPathSegments().get(1); deleteRows = db.delete("Book", "id=?",new String[] { bookId }); break; case CATEGORY_DIR: deleteRows = db.delete("Category", selection, selectionArgs); break; case CATEGORY_ITEM: String categoryId = uri.getPathSegments().get(1); deleteRows = db.delete("Category", "id=?",new String[] { categoryId }); break; default: break; } return deleteRows; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // 更新数据 SQLiteDatabase db = dbHelper.getReadableDatabase(); int updateRows = 0; switch (uriMatcher.match(uri)) { case BOOK_DIR: updateRows = db.update("Book", values, selection, selectionArgs); break; case BOOK_ITEM: String bookId = uri.getPathSegments().get(1); updateRows = db.update("Book", values, "id=?",new String[] { bookId }); break; case CATEGORY_DIR: updateRows = db.update("Category", values, selection, selectionArgs); break; case CATEGORY_ITEM: String categoryId = uri.getPathSegments().get(1); updateRows = db.update("Category", values, "id=?",new String[] { categoryId }); break; default: break; } return updateRows; }}
最后不要忘了在AndroidManifest.xml中进行注册:
<!-- 注册自定义的内容提供器 --> <provider android:name="com.android_3100_androidpersistence.DatabaseProvider" android:authorities="com.android_3100_androidpersistence.provider" android:exported="true" ></provider>
注意:使用内容提供器时,如果报null异常,一般就是uri 和你定义的地址没有匹配上
22.SurfaceView 的基本框架 SurfaceView可以做许多交互性的东西,比如说最常见的互动游戏
package com.luckPan;import android.content.Context;import android.graphics.Canvas;import android.util.AttributeSet;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;public class SurfaceViewTemplate extends SurfaceView implements Callback, Runnable { private SurfaceHolder mHolder; private Canvas mCanvas; /** * 用于线程绘制 */ private Thread t; /** * 线程的控制开关 */ private boolean isRunning; public SurfaceViewTemplate(Context context) { this(context,null); } public SurfaceViewTemplate(Context context, AttributeSet attrs) { super(context, attrs); mHolder = getHolder(); mHolder.addCallback(this); //设置可获得焦点 setFocusable(true); setFocusableInTouchMode(true); //设置常量 setKeepScreenOn(true); } public void surfaceCreated(SurfaceHolder holder) { isRunning = true; t = new Thread(this); t.start(); } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } public void surfaceDestroyed(SurfaceHolder holder) { isRunning = false; } public void run() { while(isRunning){ draw(); } } private void draw() { try { mCanvas = mHolder.lockCanvas(); if (mCanvas != null) { //draw something } } catch (Exception e) { }finally{ if (mCanvas != null) { mHolder.unlockCanvasAndPost(mCanvas); } } }}
- android快速开发框架
- android 快速开发框架
- android快速开发框架
- android快速开发框架
- android快速开发框架
- android快速开发框架
- 快速开发Android
- android快速开发框架
- Android ndk 快速开发
- android 快速开发框架
- android快速开发系列
- Android快速开发框架
- Android快速开发框架
- Android快速开发框架
- android 快速开发工具
- Android快速开发
- Android快速开发框架
- Android 快速开发框架
- Redis可视化监控工具
- 关于图像的通道、深度等概念
- 一个资深iOS开发者对于React Native的看法
- 从数据库存储mp3和提取mp3
- application/x-www-form-urlencoded、multipart/form-data、text/plain
- Android快速开发
- 正则表达式之人人都看的懂正则
- JavaIO操作之 字节 输入输出流
- 获取表单中的Name值-->Enumeration介绍
- Studio中导出手机数据库
- 简单展开菜单
- 深入分析动态代理
- redis连接
- Android图片压缩处理