?android的开发环境搭建完毕后,想看看代码,无奈博主懒啊!没有耐心看书啊!只好想先做个小例子,然后不会的知识点在去查,这样比较有动力 。话不多说了,进入正题。
需求是这样的,做一个便签功能,默认给用户两个便签,第一个有默认欢迎文字。用户修改完便签内容后,自动保存。
这次涉及到两个知识点,一是对数据库的操作,要查询、添加、修改;二是动态生成控件,用户可以添加新便签(后续实现)。
既然是动态添加,activity_main.xml(我的主页面)里就是空白的内容了,没有任何控件。
先看下代码结构
MainActivity是程序主入口,Dao是操作数据库的类,EditTextFacory是用来创建文本框EditText的。
具体代码见附件,我这里主要说下我遇到的问题和一些关键代码。
1、操作数据库要继承SQLiteOpenHelper类,它是一个抽象类,需要重写onCreate 方法和构造方法,主要用来创建数据库的。
private SQLiteDatabase db = null; public Dao(Context context, int version) { super(context, DBConstant.DB_NAME, null, version); if(db==null) db = this.getWritableDatabase(); }
?
?
@Override public void onCreate(SQLiteDatabase db) { String sql = "create table " + DBConstant.TABLE_NAME + "(" + "id integer," + "content text"+ ")"; db.execSQL(sql); }
?
?
后面的关于增删改查的方法就可以自己编写了,可jdbc里的差不多,这里只看一个插入的例子吧!
public void insert(int id,String txt){ db.execSQL("insert into "+DBConstant.TABLE_NAME+" values(?,?)", new Object[]{id,txt}); }
?(android的各个类名、方法名都比较通俗易懂,不知道的方法可以大胆尝试,也许就是你猜测的功能哦)
?
补充:在写查询的时候,先看下 它的查询方法
Cursor cursor = this.getReadableDatabase().rawQuery(sql, null);
它返回的是一个?Cursor!对,就像数据库里的游标,循环它的时候可以这样
while(cursor.moveToNext())
?
?
2、动态生成控件
这个地方纠结了我挺长时间。现在说说我遇到的问题。
首先我是从数据库里查出用户的便签数据,然后创建EditText,问题出现在布局上。我创建的两个EditText,第一个是有默认文字的,第二个是空白的,运行起来后只能看到第二个空白的便签,第一个被盖住了!无论我怎么设置margin(是不是和html里很像)都不好使,最后参考了http://bbs.9ria.com/thread-246707-1-1.html里的写法,在原来已有页面的基础上,新建了一个Layout,然后对这个layout进行设置
RelativeLayout view = new RelativeLayout(this);RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,60);Log.i("info", txt.getId()+"的margin:"+(20+(txt.getId()-1)*(60+20))); params.setMargins(0, 20, 0, 0);//距离上一控件距离view.addView(txt, params);
?总结:在对控件进行布局设置的时候,最好是新创建一个layout,不要在最基础的上面进行设置。
?
?3、EditText的样式设置:
EditText创建出来后,可以设置一些基本样式,比如背景颜色等。
这些方法都比较简单,从字面上就能理解意思。这里要说的有一点,setBackgroundColor的时候,里面的参数是int类型的,这就让人很矛盾了,int类型是什么颜色呢?第一次接触的时候应该怎么知道有哪些值呢?这里说下,setBackgroundColor,设置颜色,那我就看看有没有跟颜色相关的类,Color+Alt+/一下,发现果然有这个类,嘿嘿。发现里面有一些定义好的静态变量,如果你想设置类似#FFF这样的颜色也可以,Color里有个parseColor方法可以帮你。同样的,我在设置setInputType的时候,发现里面的参数也是int,就试下InputType,还真有这个类。。。
4、给EditText设置失去焦点事件(即html里的onblur),使之在失去焦点的时候保存数据
editText.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(!hasFocus){ Dao dao = new Dao(context, 1); dao.update(v.getId(), ((EditText)v).getText().toString()); } } });
?
?