Android开发之项目经验分享

在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));

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏葬爱家族

Mvvm、RxJava、Retrofit 三剑合璧

说起现在Android流行的app架构,脱口而出MVP、MVVM,要问两者区别,张口就来,balabalabala。。但是公司所有项目用的都是MVP,从没正式用...

50220
来自专栏Android开发指南

1.ActionBar

29750
来自专栏Android Note

RecyclerView 刷新闪烁

49770
来自专栏Golang语言社区

Golang context 包入门

概述 Golang 的 context Package 提供了一种简洁又强大方式来管理 goroutine 的生命周期,同时提供了一种 Requst-Scope...

406100
来自专栏移动开发之家

通用RecylerAdapter,内置XRecyclerView,兼容上下拉与动画,高复用,一个Adapter通用所有页面,支持空页面,懒人专属

这是欢迎各位践踏的Github:https://github.com/CarGuo

11550
来自专栏分享达人秀

手把手教你读懂源码,View的加载流程详细剖析

最近想要理清我们的View是如何加载到界面中的,最好的方式就是分析源代码,这里一同分享给有需要的朋友们。内容较多,需要一定的耐心,请斟酌学习! ...

25880
来自专栏ppjun专栏

Android十八章:5分钟学会用MVP架构开发Android项目

mvp 的思想是把显示和业务逻辑从activity,fragment这些View中分离。让model和view的通信通过Presenter来搞定,这样子就降低了...

13520
来自专栏分享达人秀

使用SimpleAdapter

通过ArrayAdapter实现Adapter虽然简单、易用,但ArrayAdapter的功能比较有限,它的每个列表项只能给一个TextView动态填充...

214100
来自专栏向治洪

android自定义属性

1、引言 对于自定义属性,大家肯定都不陌生,遵循以下几步,就可以实现: 自定义一个CustomView(extends View )类 编写values/a...

220100
来自专栏移动开发的那些事儿

内存泄露的一些坑

如上,在Activity内部如果声明一个这样的Handler,那么myHandler就默认持有Activity引用,假设Activity退出了,但是可能这时候才...

35120

扫码关注云+社区

领取腾讯云代金券