在Android开发中,除了基本的理论知识,还需要将所学知识运用到真实的项目中,在项目中锻炼自己的分析问题、解决问题的能力,本文将总结一下本人项目中遇到的一些问题,总结成章,与大家共勉~~~
1、如何拉伸一个图片为一条线
项目需求:需要在布局中设置一条分割线,该分割线需要自定义,美工也给了一张图片,那么如何实现?
在drawable目录下创建一个repeat.xml:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/bg"
android:tileMode="repeat" />
然后在布局的xml文件中可以这样引用:
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="1px"
android:background="@drawable/repeat" >
</LinearLayout>
2、图片在SQLite中的存取
(1)存储Drawable对象到数据库
//第一步,将Drawable对象转化为Bitmap对象
Bitmap bmp = (((BitmapDrawable)tmp.image).getBitmap());
//第二步,声明并创建一个输出字节流对象
ByteArrayOutputStream os = new ByteArrayOutputStream();
//第三步,调用compress将Bitmap对象压缩为PNG格式,第二个参数为PNG图片质量,第三个参数为接收容器,即输出字节流os
bmp.compress(Bitmap.CompressFormat.PNG, 100, os);
//第四步,将输出字节流转换为字节数组,并直接进行存储数据库操作,注意,所对应的列的数据类型应该是BLOB类型
ContentValues values = new ContentValues();
values.put("image", os.toByteArray());
db.insert("apps", null, values);
db.close();
过程总结
Drawable→Bitmap→ByteArrayOutputStream→SQLite
(2)从数据库读取图片
//第一步,从数据库中读取出相应数据,并保存在字节数组中
byte[] blob = cursor.getBlob(cursor.getColumnIndex("image"));
//第二步,调用BitmapFactory的解码方法decodeByteArray把字节数组转换为Bitmap对象
Bitmap bmp = BitmapFactory.decodeByteArray(blob, 0, blob.length);
//第三步,调用BitmapDrawable构造函数生成一个BitmapDrawable对象,该对象继承Drawable对象,所以在需要处直接使用该对象即可
BitmapDrawable bd = new BitmapDrawable(bmp);
总结思路为
SQLite→byte[]→Bitmap→BitmapDrawable
3、修改 EditText.setError("Info"); 的字体颜色
在 res/values/styles.xml文件中,在自定义主题里加入一个item:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppBaseTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:textColorPrimaryInverse">@android:color/primary_text_light</item>
</style>
</resources>
然后到AndroidMenifest.xml中修改Application的主题为上述主题,即 android:theme="@style/AppBaseTheme"
4、notifyDataSetChanged 无效的问题
问题描述:调用notifyDataSetChanged 界面并没有刷新
一般情况下,适配器的对应的list数据源如果发生了改变,调用该方法能达到刷新列表的效果,但是有时候发现 当list的数据变化时,采用notifyDataSetChanged()无效。 仔细研究后发现,其实adapter是对list的地址的绑定,而当list重新赋值后,会导致了list指向了新的list的地址。 于是乎,为了解决这个问题,先采用 list.clear(); list.addAll(newlist);
然后采用 adapter.notifyDataSetChanged()
,就搞定了。
5、如何获取activity上所有的控件,并获取自己想要的控件进行操作
public List<View> getAllChildViews()
{
//decorView是window中的最顶层view,可以从window中获取到decorView
View view = this.getWindow().getDecorView();
return getAllChildViews(view);
}
private List<View> getAllChildViews(View view)
{
List<View> allchildren = new ArrayList<View>();
if (view instanceof ViewGroup)
{
ViewGroup vp = (ViewGroup) view;
for (int i = 0; i < vp.getChildCount(); i++)
{
View viewchild = vp.getChildAt(i);
allchildren.add(viewchild);
allchildren.addAll(getAllChildViews(viewchild));
}
}
return allchildren;
}
public void check(List<View> list)
{
for (int i = 0; i < list.size(); i++)
{
View v = list.get(i);
//判断是不是Button
if (v instanceof Button)
{
((Button) v).setText("改变");
}
}
}
6、去除GridView的默认点击背景颜色
GridView.setSelector(new ColorDrawable(Color.TRANSPARENT));