首页 > 代码库 > android 编程小技巧(持续中)

android 编程小技巧(持续中)

first:
    Intent跳转一般存用于Activity类,可是若要在非activity类里跳转的话,解决方法是在startActivity(intent)前加mContext即上下文,终于为:mContext.startActivity(intent);  换言之。以后在非activity类里调用activity的方法  一律这么做。若不行的话 能够这么做:(Activity)mContext。



second:
  gridview中textview内容不能居中的问题。

gridview中能够设置一行显示多少个item,所以他为每一个item都预留了一部分空间。

若用textview来填充item 而textview的属性又为wrap_content时。由于内容较少,仅仅占领了分配空间的一部分,所以不管怎么去调试属性。看上去都像是顶格显示;故解决方法是让textview的宽度为marth_parent。这样grity = "centre"才会有:-D。




third:
   Scrollview以下仅仅能嵌套一个控件,当有多个控件时能够在Scrollview里套上一个Relativelayout 就能够就解决这个问题。

forth:
  Android SDK Content load非常慢          解决方法 在 C:\Documents and Settings\计算机名 这个路径下有个.android目录, 把这个目录删了 然后重新启动模拟器 会弹出一个对话框 Welcome to Android Development 选择NO就能够了


five:
        在多层嵌套时 若层数过多会出现 明明控件的visibilty是visible 但在界面上仍是不可见的情况  貌似相当的诡异 解决方法:多个布局换着用 不要一直用linearlayout 能够套一个relativelayout。

原因不明



six:
        若activity里的某些响应时基于adapter数据的 而adapter又与activity分开 使得数据无法回传到activity(详细见Listview与GridView预留数据接口一文) 解决方法例如以下:
  一般来说adapter是由activity调用的 须要传入activity的activity listdata等等信息 所以 我们在就收数据时 把activity方法得到 见代码:

            QYSPActivity activty;  //调用这个adapter的activity类 

public QYSPFLInfoAdapter(Activity activity, List<SPFLData> listdata) {
super(activity, 0, listdata);
activty = (QYSPActivity) activity;  // 获取activity的类
}

在须要的地方调用activity里的方法
activty.doPost(XXXXX);   //doPost()是在activity里定义好的方法 public

记住了 取名字的时候不要取activity 由于这个名字与 (QYSPActivity) activity 一样。然后获得的activity方法就是空的  然后 然后 各种error 解决方法 换名字或者 this.activity =  (QYSPActivity) activity;  说白了 就是this. 语句  伤不起~~
目測这种方法能够举一反三   可是怎么反  待定。。。

seven:
  setContentView和inflate差别  setContentView()一旦调用, layout就会立马显示UI;而inflate仅仅会把Layout形成一个以view类实现成的对象,有须要时再用setContentView(view)显示出来 .一般在activity中通过setContentView()将界面显示出来,可是假设在非activity中怎样对控件布局设置操作了。这需LayoutInflater动态载入  

eight:

 动态删除listview的item
nine:
   使用contentView+静态类ViewHolder类来优化adapter   当我们推断 convertView == null  的时候,假设为空,就会依据设计好的List的Item布局(XML),来为convertView赋值,并生成一个viewHolder来绑定converView里面的各个View控件(XML布局里面的那些控件)。再用convertView的setTag将viewHolder设置到Tag中,以便系统第二次绘制ListView时从Tag中取出。(看以下代码中) 

   ViewHolder holder;

if(convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.list_item, null); holder.img = (ImageView)convertView.findViewById(R.id.img); holder.title = (TextView)convertView.findViewById(R.id.title); holder.info = (TextView)convertView.findViewById(R.id.info); convertView.setTag(holder); }else { holder = (ViewHolder)convertView.getTag(); holder.img.setImageResource(R.drawable.ic_launcher); holder.title.setText("loulijun"); holder.info.setText("www.cnblogs.com/loulijun"); }

eleven:   单个控件的xml不能放缩问题
  事实上这里无论你将Button的layout_width和layout_height的值改动成多少。都不会有不论什么效果的。由于这两个值如今已经全然失去了作用。平时我们常常使用layout_width和layout_height来设置View的大小,而且一直都能正常工作,就好像这两个属性确实是用于设置View的大小的。而实际上则不然,它们事实上是用于设置View在布局中的大小的,也就是说,首先View必须存在于一个布局中,之后假设将layout_width设置成match_parent表示让View的宽度填充满布局,假设设置成wrap_content表示让View的宽度刚好能够包括其内容。假设设置成详细的数值则View的宽度会变成对应的数值。这也是为什么这两个属性叫作layout_width和layout_height,而不是width和height。

再来看一下我们的button_layout.xml吧。非常明显Button这个控件眼下不存在于不论什么布局其中,所以layout_width和layout_height这两个属性理所当然没有不论什么作用。

那么如何改动才干让按钮的大小改变呢?解决方法事实上有非常多种,最简单的方式就是在Button的外面再嵌套一层布局. 当然这个时候最外层的布局失去作用了。


ten: throw与throws的差别
  throw语句用在方法体内,表示抛出异常,由方法体内的语句处理  
throws语句用在方法声明后面,表示再抛出异常,由调用这种方法的上一级方法中的语句来处理 
throws主要是声明这种方法会抛出这样的类型的异常,使其它地方调用它时知道要捕获这个异常。 
throw是详细向外抛异常的动作,所以它是抛出一个异常实例。

 

throws说明你有哪个可能。倾向  
throw的话。那就是你把那个倾向变成真实的了 同一时候: 
1)throws出如今方法函数头;而throw出如今函数体;  
2)throws表示出现异常的一种可能性。并不一定会发生这些异常。throw则是抛出了异常,运行throw则一定抛出了某种异常;  
3)两者都是消极处理异常的方式(这里的消极并非说这样的方式不好)。仅仅是抛出或者可能抛出异常,可是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。


twelve: gravity与 layout_gravity
  android:gravity:是对view控件本身来说的。是用来设置view本身的文本应该显示在view的什么位置,默认值是左側
  android:layout_gravity:是相对于包括改元素的父元素来说的。设置该元素在父元素的什么位置
 对于LinearLayout假设设置android:orientation="vertical"。那么android:layout_gravity的设置仅仅在水平方向生效。假设设置android:orientation="horizontal"。那么android:layout_gravity属性仅仅在垂直方向生效。

  

thirteen:带删除button及功能的输入框
  
     * 由于我们不能直接给EditText设置点击事件,所以我们用记住我们按下的位置来模拟点击事件
     * 当我们按下的位置 在 EditText的宽度 - 图标到控件右边的间距 - 图标的宽度 和
     * EditText的宽度 - 图标到控件右边的间距之间我们就算点击了图标,竖直方向没有考虑
  这三行话 是关键。



 代码例如以下: 
  boolean touchable = event.getX() > (getWidth()
                        - getPaddingRight() - mClearDrawable.getIntrinsicWidth())
                        && (event.getX() < ((getWidth() - getPaddingRight()))); //mClearDrawable为删除button
                if (touchable) {
                    this.setText("");
                } 

在输入框中加入删除button

forteen: open failed: EISDIR (Is a directory)

  在SD卡中创建目录目录的时候,应该一层一层的创建目录,可是不能一次同一时候创建这两个目录.easy把详细创建的文件当作要创建的空目录来创建。

将"/mnt/sdcard/zhufu/apkbus.db"当作目录来创建,这样就会出现EISDIR错误,解决方法:先创建前面的目录,在创建终于文件。

  如:File parentFile = new File(path);
    if (!parentFile.exists()) {
     parentFile.mkdirs();
    }
    File file = new File(parentFile, filename + ".jpg");//这就是终于存放位置,在这里千万不能反复madirs,否则就会出现上面的错误。

15:播放同一个文件MediaPlayer报IO异常
  解决方法:可以播放一次说明Player及文件都是没有问题的,可是假设播第二次  有时候或报IO异常,原因是待播放的文件正在被占用。若要正常播放的话必须在Player使用它之前,这个资源是被 release的。

player.release(); 。



16: scrollview默认初始位置在顶部

由于scrollView里面ListView的上面还有其它的控件,所以我想到一个办法就是使得一開始的时候就让上面当中一个控件获得焦点。滚动栏自然就到顶部去了,例如以下:

txtBaseMsg.setFocusable(true);
txtBaseMsg.setFocusableInTouchMode(true);
txtBaseMsg.requestFocus();


控制其滑动究竟部: sv.fullScroll(ScrollView.FOCUS_DOWN);

17:  Notification 动态图标
 一般默认notification的图标是静态的,可是在某些情况下 图标须要是动态的,解决方法事实上蛮简单 就是给notification不停的换icon,然后就显示出来。

     notif.iconLevel = 0;
   manager.notify(0, notif);
   
   SystemClock.sleep(100);
   
   notif.iconLevel = 1;
   manager.notify(0, notif);

18: getWidth和getMeasuredWidth 差别 

getWidth(): View在设定好布局后,整个View的宽度

getMeasuredWidth():对View上的内容进行測量后得到的View内容占领的宽度。前提是你必须在父布局的onLayout()方法或者此View的onDraw()方法里调用measure(0,0);(measure參数的值能够知己定义)。否则得到的结果和getWidth()得到的结果是一样的。

这两个方法最基本的差别在于,是否使用了measure()方法,同一时候measure()使用的位置也非常重要。

getHeight() 和 get MeasuredHeight() 差别同理。

 geiHeight有时候会得到0,一般原因是在View还未绘制完之前调用这种方法,所以得到的就是0。

解决该问题的方法有非常多,主要就是延后调用这些方法。

能够试着在onWindowFocusChanged()里面调用这些方法。


19onItemClickListener点击区分
  多个listView或GridView都要获得item的点击监听时,一般都是直接调用系统的onItemClickListener接口,可是他们并不能区分开来,并且得不到id,不能像ClickListener一样用v.getId来区分,可是能够利用parent的get来区分,他就相当于clickListener的view一样。

20:在文字以下图片(代码版)
//获得图片资源及大小 最后两句为销毁图片 防止OOM

  Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.icon_daohang_select);
        width = bitmap.getWidth();
        height = bitmap.getHeight();
        bitmap.recycle();
        bitmap = null;


重点来了:
  holder.text1.setText(mTextList.get(position));
            Drawable d = mContext.getResources().getDrawable(mImgList.get(position));
            d.setBounds(0, 0, width, height);
            holder.text1.setCompoundDrawables(null, d, null, null);

    


21:关于在xml里 android:onClick="onClick"的巧妙使用方法
    在代码里若引入了其它地方的xml那么xml的点击事件就有一点麻烦,所以能够採用之前题目的那个方法。由于这个和android自带的onclick事件同样,所以能够直接套用点击方法。(其它部分与普通onclick事件一样)。


22 :设置导航栏和状态栏(仅仅对4.4或以上实用)
     这个就是用来设置app上方的界面,就是显示WiFi标志 时间 电池信息什么的 
设置方法:
首先要打开activity的透明主题功能,能够把activity的主题设置继承*.TranslucentDecor 主题,然后设置 android:windowTranslucentNavigation 或者android:windowTranslucentStatus的主题属性为true,又或者在activity的代码里面开启 FLAG_TRANSLUCENT_NAVIGATION 或是  FLAG_TRANSLUCENT_STATUS的window窗体标识。

 

    激活:
// 创建状态栏的管理实例SystemBarTintManager tintManager = new SystemBarTintManager(this);
// 激活状态栏设置tintManager.setStatusBarTintEnabled(true);
// 激活导航栏设置tintManager.setNavigationBarTintEnabled(true);

设置状态栏颜色和图片

// 设置一个颜色给系统栏
tintManager.setTintColor(Color.parseColor("#99000FF"));
// 设置一个样式背景给导航栏
tintManager.setNavigationBarTintResource(R.drawable.my_tint);
// 设置一个状态栏资源
tintManager.setStatusBarTintDrawable(MyDrawable);

23:Intent的Flag任用
在Activity中若用清除之前全部的Activity和Task 最好的方法是给Activity加个Flag FLAG_ACTIVITY_CLEAR_TASK 这个Flag的解释是在此activity启动之前。不论什么与此activity相关联的task都会被清除。也就是说,此 activity将变成一个空栈中新的最底端的activity,全部的旧activity都会被finish掉。这个标识只和FLAG_ACTIVITY_NEW_TASK联合起来才干使用。
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
若想保留2个Activity也就是说要在新Task里保留2个Act 那么最好的做法是一次启动两个Activity,详细操作例如以下:
Intent intent  = new Intent(this,A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
intent = new Intent(this,B.class);
startActivity(intent);
这个时候系统会直接跳到B界面。同一时候A会放在Task的最底层。从B界面返回 会回到A界面。



24:获取控件在屏幕中的位置
     getLocationOnScreen ,计算该视图在全局坐标系中的x,y值。(注意这个值是要从屏幕顶端算起。也就是索包含了通知栏的高度)//获取在当前屏幕内的绝对坐标 


getLocationInWindow 。计算该视图在它所在的widnow的坐标x。y值。//获取在整个窗体内的绝对坐标 (不是非常理解= =、)

getLeft getTopgetBottomgetRight这一组是获取相对在它父亲里的坐标

 假设在Activity的OnCreate()事件输出那些參数。是全为0,要等UI控件都载入完了才干获取到这些。





25android:ellipsize的使用

EidtText和textview中内容过长的话自己主动换行。使用android:ellipsize与android:singleine能够解决,使仅仅有一行。

EditText不支持marquee

使用方法例如以下:

在xml中

android:ellipsize = "end"    省略号在结尾

android:ellipsize = "start"   省略号在开头

android:ellipsize = "middle"     省略号在中间

android:ellipsize = "marquee"  跑马灯

android:singleline = "true"

当然也能够用代码语句

tv.setEllipsize(TextUtils.TruncateAt.valueOf("END"));

tv.setEllipsize(TextUtils.TruncateAt.valueOf("START"));

tv.setEllipsize(TextUtils.TruncateAt.valueOf("MIDDLE"));

tv.setEllipsize(TextUtils.TruncateAt.valueOf("MARQUEE"));

tv.setSingleLine(true);


26:edittext光标
  在XML中:Android:pidding = "10dp"就能够把光标往后移一点
 在代码中把光标设在字体后面:titleView.setSelection(titleView.getText().length()); ()里为输入框内容长度。


27:drawpidding与与drawableLeft
 后者设置textview的左(可上 下 左 右)边界图片。前者用来设置text与drawable(图片)的间隔。

28:中文加粗
TextView tv = (TextView)findViewById(R.id.TextView01); 
TextPaint tp = tv.getPaint(); 
tp.setFakeBoldText(true);
 其它自己加粗:
在xml文件里使用android:textStyle=”bold”

29:View中利用TAG传值
比如 给一个动态View加入点击事件,点击事件中要获得View中的某些值。那怎么把值传递过去呢?这里就要用到TAG了。
点击事件能够这样写:
    view.setOnClickListener(new ContactClick());
 监听事件能够这样实现:
private class ContactClick implements OnClickListener {

  @Override
  public void onClick(View v) {
}
}

可是这种话得不到View里的数据。点击事件不能完毕。

so。利用setTag与getTag来传递消息。
View中Tag有两种使用方法:
 1。View.setTag(Object tag);
        API是这样写的: Sets the tag associated with this view. A tag can be used to mark a view in its hierarchy and does not have to be unique within the hierarchy. Tags can also be used to store data within a view without resorting to another data structure.
        翻译:设置与此视图关联的标签。 tag可用于标记层次结构中的 view而层次结构不必是唯一的。

标签还能够用于存储视图中的数据,而不诉诸其它数据结构。(第二句话目測翻译有问题)

 与之配套使用 的是view.getTag(); API:the Object stored in this view as a tag。以一个tag返回存储在View中的Object。
 2,View.setTag(int key, Object tag)
    API:  Sets a tag associated with this view and a key. A tag can be used to mark a view in its hierarchy and does not have to be unique within the hierarchy. Tags can also be used to store data within a view without resorting to another data structure. The specified key should be an id declared in the resources of the application to ensure it is unique (see the ID resource type). Keys identified as belonging to the Android framework or not associated with any package will cause an IllegalArgumentException to be thrown.
  翻译:设置与此视图关联的一个tag和一个key。

 tag 可用于标记层次结构中查看层次结构中不必是唯一的。Tags 还能够用于存储视图中的数据,而不诉诸其它数据结构。key 应是指定的密钥id中声明的应用资源。以确保它是独一无二的(见ID资源类型)。

Keys 为属于Android框架或不相关的不论什么包的密钥,否则将导致抛出一个IllegalArgumentException。(翻译有问题)



二者本质上没有差别,都是传值,可是①一般仅仅是传单个值。而②就克传多个值。

而在传多个值时值得注意的是这个Key,他不能为普通的int型数据,它要的是与其它控件一样的id,且不能是反复的。so解决方法是在value里新建ids.xml文件 里面存放id  

eg:  <item name="tag_name" type="id"></item>
    <item name="tag_address" type="id"></item>
在调用的时候用  R.id.tag_name  就能够解决这个问题了。


末了 完整版的解决方式是:

  // 加入数据
    view.setTag(R.id.tag_name, str1); 
    view.setTag(R.id.tag_address, str2); 
    // 加入监听
    view3.setOnClickListener(new ContactClick());

// 监听事件
 private class ContactClick implements OnClickListener {

  @Override
  public void onClick(View v) {
   // TODO Auto-generated method stub
//获取数据
   String name = (String) v.getTag(R.id.tag_name);
   String address = (String) v.getTag(R.id.tag_address);
  
  }
 }

30:在代码里面无法设置textview文字居左问题
 有时候在代码里面无法设置TextView的文字走向,那么解决这个问题的方法是:
   
     LayoutParams params = new RelativeLayout.LayoutParams(
       LayoutParams.WRAP_CONTENT,
       LayoutParams.WRAP_CONTENT);
     params.addRule(RelativeLayout.CENTER_VERTICAL);
     tv.setLayoutParams(params);
     tv.setGravity(Gravity.LEFT);
又一次设置TextView的layout,然后再来设置文字走向。


31:监听返回键
经常哟重写返回键事件,通常是去重写button点击事件。然后再推断是否是返回键 是否是按下什么的,这样做一般比較繁琐,android里有onBackPress()方法,重写它就是了

32:遍历Map
    在不知道Map数据情况下。须要遍历Map里面的数据。那么须要对map进行遍历。有方法例如以下:
   
  Iterator it = levelMap.entrySet().iterator();
  while (it.hasNext()) {
    //获得节点
   Entry entry = (Entry) it.next();
    //获得节点的key values
   String key = (String) entry.getKey();
   String value = http://www.mamicode.com/(String) entry.getValue();
  }
            ****方法不唯一
  over~

33:遍历list并删除某个item注意事项
    遍历list的方法非常多。但假设在遍历的时候须要删除某个节点的话,那么不能用for()循环来删除了,使用for循环删除的问题是这样出现的,我删除了i= 5的节点(i++之后i= 6了)。那么我做下一次推断的时候就直接去判读新list的i = 6处的值了,可是新list的长度-1了,而且原来i>5之后的内容都往前移了一位,原来i= 6的节点跑到了i= 5处,可是从上文可知,i= 5节点没有推断。so error occurs。
    解决方法:1,构建一个与待遍历的list一样的list。一个作为遍历的对象。一个作为删除的对象,二者分开就没有问题了。最后把删除对象的值赋值待遍历对象就OK了。

                      2。使用Iterator 来遍历,须要删除的时候使用it.remove()即可了。

(it.remove()仅仅能调用一次,多次就抛异常了)

                      3。还是使用for来遍历 。不管用Iterator 还是for(),删除的都是当前item,由上文可知,由于删除了i=5节点之后,下一次就推断i=6的节点。原来的i= 6节点(新list的i= 5)没有推断,那么每删除一次节点之后把i的值减一不即可了吗?! 下一次推断的时候还是从i= 5開始。而i= 5刚好是之前的i= 6,这样就避免了之前的漏判问题,那就OK了(此法仅仅是构想。还没实践,只是应该能够)。
    over~

34:webView禁止复制粘贴
    长按选择粘贴文字是webView的onLongClickListener功能。若要禁止复制。那么拦截这个事件就可以。
        this.appView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {
        return true;//禁止事件返回
        }
        });

35:防截屏
    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);

36:背景变暗
    WindowManager.LayoutParams lp = getWindow().getAttributes();
      lp.alpha = 0.3f;(比1小就可以)
    getWindow().setAttributes(lp);
37 :截屏并保存
        activity.getWindow().getDecorView().setDrawingCacheEnabled(true);
        Bitmap bmp = activity.getWindow().getDecorView().getDrawingCache();
        try {
            OutputStream out = new FileOutputStream(Filename);
            bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
            out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }

38 :截屏模拟点击
    android里有时候把数据和点击事件封装好了以后。须要人为去触发(如pager的默认首页)。可是在程序里又没法点击,这个时候就能够用view.performClick()。

前提:有view.onClickListener方法设置了监听。
注意:假设同一时候使用了view.setOnTouchListener()方法。则有可能存在拦截view.performClick()的响应事件。由于当view.OnTouchEvent()在event.getAction() == MotionEvent.ACTION_DOWN时返回false,系统会觉得view不须要处理Touch事件,则兴许的Touch事件(move、up、click)就不会被传进来,所以也不会触发view.performClick()。而view.setOnTouchListener()相当于是重写了view.OnTouchEvent(),所以在写view的TouchListener处理时,须要留意view是否存在点击事件监听,假设有,则在适当的位置使用view.performClick()触发点击事件。

39:时钟
时钟控件包含AnalogClock和DigitalClock,它们都负责显示时钟,所不同的是AnalogClock控件显示模拟时钟,且仅仅显示时针和分针,而DigitalClock显示数字时钟,可精确到秒。
二者都是直接在xml里加控件。不须要在java代码控制。直接就能够自己主动显示时间。

40:ExpandableListView默认所有展开且点击不收缩
所有展开:
 //展开全部的Group
 private void expandELV(ExpandableListView elv,
   BaseExpandableListAdapter adapter) {
  for (int i = 0; i < adapter.getGroupCount(); i++) {
   elv.expandGroup(i);
  }
 }

//屏蔽group的点击事件
 private void blockGroupClick(ExpandableListView elv) {
  elv.setOnGroupClickListener(new OnGroupClickListener() {
   public boolean onGroupClick(ExpandableListView parent, View v,
     int groupPosition, long id) {
    return true;
   }
  });
 }

41:点击password可见隐藏
android中为EditText提供了setTransformationMethod来控制password的显隐。主要代码例如以下:

         /* show the password*/
  edittext.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); 

         /* hide the password */
  edittext.setTransformationMethod(PasswordTransformationMethod.getInstance());     

或者利用InputType也行。
 // 显示为普通文本  
pwdEdit.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);  
  // 显示为password  
 pwdEdit.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);  

42:导入自己定义属性
 xmlns:hyman="http://schemas.android.com/apk/res-auto"

43:android ViewPager xml inflate error
 add support android-support-v4.jar in lib folder. add this jar in Build Path. now go to project property-->Build Path--> Order & Export--> select all --> ok. Clean & RUN.

44 : android java.lang.NoSuchFieldError: R$id.xxx

第一种情况 參考自http://www.shangxueba.com/jingyan/1856083.html

    将引用的自己定义控件的xml文件里的最外层布局上面加入xmlns:sat=“http://schemas.Android.com/apk/res/控件所在位置的包名”但是在执行时就会报Java.lang.NoSuchFieldError:包.R$id.xxx错。

同一时候还会出现no resource identifier found for attribute 的错误。

    将xmlns:sat=“http://schemas.android.com/apk/res/控件所在位置的包名”更改为

    http://schemas.android.com/apk/res-auto 就不会报错了

另外一种 參考:http://www.hankcs.com/program/mobiledev/e-androidruntime-fatal-exception-main-java-lang-nosuchfielderror.html

这个问题是因为主项目覆盖了库项目的xml所致。假设主项目中的某个xml里定义了一个跟库项目中的xml同名的xml,那么库中的xml将会被覆盖。这里的覆盖意思是,编译后仅仅有主项目中的xml以及R.id。全然没有库项目的影子。

所以才会有NoSuchFieldError的错误。

这个错误不会在编译的时候提示。算得上一个陷阱了。

解决方法非常easy,删除主项目中的xml,整个项目仅仅保留一份xml就可以。

链接:http://blog.csdn.net/zgf1991/article/details/47106235


45:WebView透明背景
1,android:background="@android:color/transparent"
2。 web_view.setBackgroundColor(0);
3,在某些场合 加上2也无效,那是因为开启了软加速所致,解决方法。关闭就可以。
wvContent.setLayerType(View.LAYER_TYPE_SOFTWARE,null);  

46:
在应用内屏蔽系统字体大小变化
在Application的onCreate方法里添加一下方法即可(不是每一个都准)。

        Resources res = getResources();
        Configuration config = new Configuration();
        config.setToDefaults();
        res.updateConfiguration(config, res.getDisplayMetrics());

47:ViewGroup与子View点击冲突
有时候在ViewGroup和子View都有点击事件的时候,ViewGroup的事件非常easy被View捕捉到而无法。那么久能够使用 android:descendantFocusability = “”属性,他的主要作用是规定Group与子View之间的焦点关系。主要属性有三种。

  • beforeDescendants  :Group会优先于子View获得焦点;
  • afterDescendants :Group仅仅有在子View不须要焦点的时候获得焦点;
  • blocksDescendants :Group强制获取焦点。

48:ListView/GridView本身就有setEmptyView方法。


49:图片变色 

项目中我们还可能遇到图片内容同样。不过颜色不同的情况。

这个时候我们就能够使用Android提供的着色来完毕,而不用提供好几套图片。比如在Android 5.0+上我们能够使用 android:tint  android:tintMode,在低版本号中能够使用 ColorFilter

对于那些内容颜色等都同样,仅仅是方向不同的图片。我们能够仅仅保留一中方向的,其它方向的图片通过代码实现。

比如我们能够对上面提到的 ic_favorite_black_24dp 进行翻转。创建一个 drawable

<?xml version="1.0" encoding="utf-8"?

><rotatexmlns:android="http://schemas.android.com/apk/res/android"android:drawable="@drawable/ic_favorite_black_24dp"android:fromDegrees="180"android:pivotX="50%"android:pivotY="50%"android:toDegrees="180" />

尽管Android设备的分辨率很的多。但这并不代表着我们须要为每一种分辨率都准备一套资源。

在显示差异不大的情况下。我们能够尽量复用一套图片资源。一套布局。然后再考虑特定屏幕密度。



android 编程小技巧(持续中)