first:
Intent跳轉通常存用於Activity類,但是若要在非activity類裏跳轉的話,解決方法是在startActivity(intent)前加mContext即上下文,終於爲:
mContext.startActivity(intent); 換言之。之後在非activity類裏調用activity的方法 一概這麼作。若不行的話 可以這麼作:(Activity)mContext。
second:
gridview中textview內容不能居中的問題。
gridview中可以設置一行顯示多少個item,因此他爲每個item都預留了一部分空間。html
若用textview來填充item 而textview的屬性又爲wrap_content時。因爲內容較少,僅僅佔領了分配空間的一部分,因此無論怎麼去調試屬性。看上去都像是頂格顯示;故解決方法是讓textview的寬度爲marth_parent。這樣grity = "centre"纔會有:-D。java
third:
Scrollview如下僅僅能嵌套一個控件,當有多個控件時可以在Scrollview裏套上一個Relativelayout 就可以就解決這個問題。
forth:
Android SDK Content load很是慢 解決方法 在 C:\Documents and Settings\計算機名 這個路徑下有個.android目錄, 把這個目錄刪了 而後從新啓動模擬器 會彈出一個對話框 Welcome to Android Development 選擇NO就可以了
five:
在多層嵌套時 若層數過多會出現 明明控件的visibilty是visible 但在界面上還是不可見的狀況 貌似至關的詭異 解決方法:多個佈局換着用 不要一直用linearlayout 可以套一個relativelayout。
緣由不明
android
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的外面再嵌套一層佈局. 固然這個時候最外層的佈局失去做用了。git
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錯誤,解決方法:先建立前面的目錄,在建立終於文件。web
如: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()獲得的結果是同樣的。app
這兩個方法最基本的差異在於,是否使用了measure()方法,同一時候measure()使用的位置也很是重要。框架
getHeight() 和 get MeasuredHeight() 差異同理。ide
geiHeight有時候會獲得0,通常緣由是在View還未繪製完以前調用這種方法,因此獲得的就是0。解決該問題的方法有很是多,主要就是延後調用這些方法。函數
可以試着在onWindowFocusChanged()裏面調用這些方法。
19
:
onItemClickListener點擊區分
多個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界面。
getLocationOnScreen
,計算該視圖在全局座標系中的x,y值。(注意這個值是要從屏幕頂端算起。也就是索包含了通知欄的高度)//獲取在當前屏幕內的絕對座標
getLocationInWindow 。計算該視圖在它所在的widnow的座標x。y值。//獲取在整個窗體內的絕對座標 (不是很是理解= =、)
getLeft , getTop, getBottom, getRight, 這一組是獲取相對在它父親裏的座標
假設在Activity的OnCreate()事件輸出那些參數。是全爲0,要等UI控件都載入完了才幹獲取到這些。
25:android: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 = (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:導入本身定義屬性
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就能夠。
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設備的分辨率很的多。但這並不表明着咱們需要爲每一種分辨率都準備一套資源。
在顯示差別不大的狀況下。咱們可以儘可能複用一套圖片資源。一套佈局。而後再考慮特定屏幕密度。