6-21:
代碼中設置EditText顯示輸入密碼
mContent.setInputType(InputType.TYPE_CLASS_TEXT
| ((!pwd ? InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
: InputType.TYPE_TEXT_VARIATION_PASSWORD)));
代碼中設置EditText只允許輸入數字mContent.setRawInputType(InputType.TYPE_CLASS_NUMBER);
6-8:
問題描述:IntentItem toggleItem extends listItem ,雖然設置mInten enable=false 但是還是支持鼠標點擊,且右邊不支持左邊支持.
解決過程:我反覆排查了xml 和代碼中mIntent變量的enable clickable屬性的值,發現 雖然到setEnable()中強行set clickable=false. 但是到代碼打印的log分析得出,mIntent的clickable屬性=true.查了半天都不知道是誰改變了他的clickable屬性的值.最後沒得辦法只好設置mIntent的父類的enable=false.終於問題得到完美的解決.
經驗:如果你拿一個view的屬性變化沒得的辦法控制時,試一試他的父類.可能 有出其意料的結果奧.
public void setEnable(boolean enabled) {
if (enabled) {
mTitle.setTextColor(this.getResources().getColor(R.color.white));
mIntent.setTextColor(this.getResources().getColor(R.color.white));
} else {
mTitle.setTextColor(this.getResources().getColor(R.color.black));
mIntent.setTextColor(this.getResources().getColor(R.color.black));
}
super.enable(enabled);
}
父類代碼:
public void enable(boolean enabled) {
if (mBindChild != null) {
mBindChild.setEnabled(enabled);
mTitle.setEnabled(enabled);
((View)mBindChild.getParent()).setEnabled(enabled);//解決問題的代碼
} else {
super.setEnabled(enabled);
}
}
IntenItem.java inflat 的xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/ListItemContent" >
<TextView
android:id="@+id/list_item_title"
style="@style/Text" />
<TextView
android:id="@+id/list_item_intent"
style="@style/Text"
android:focusable="true"
android:clickable="true"
android:gravity="right|center_vertical" />
</LinearLayout>
6-4:
問題描述:View 不響應OnClick事件我把focusable clickable加到
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/memory_layout"
style="@style/ListItemContent"
android:clickable="true"
android:focusable="true" >
在代碼中卻調用系統View父類的setOnClickListener設置listener 結果不響應。
解決辦法:到listItem.java中重新父類的setOnClickListener方法把listener設置到配有focusable=true clickable=true
屬性的view中,這樣才能得到響應。
6-3:
開始修這個bug的時候我以爲挺簡單的,只要到oncheckedchange()方法裏邊加上個邏輯,當checked==true時就把
switch.setchecked(false).單獨的就加這麼一個邏輯遠遠不夠,要用一個handler 把這個邏輯包起來,並且延時1毫秒。爲什麼這麼做呢? 如果不這麼做就會碰到調用時機不對的難題。在oncheckedchange()裏邊不能再一次setchecked()。如果你強行這麼做了頁面不會刷新,並且會出問題。
<Switch
android:id="@+id/sw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOff="off"
android:textOn="on" />
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
final Context c=this;
if (buttonView == sw) {
Log.d("tag", "isChecked=" + isChecked);
if (isChecked) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
// sw.setChecked(false);
Toast.makeText(c, "dfdf", Toast.LENGTH_LONG).show();
}
}, 1);
}
}
}
5-31:改memery模塊
progressBar.setProgress();不能再工作線程中操作,否則不會刷新progressBar狀態。得出經驗:工作線程不能對
view界面的狀態修改。 附上代碼
mProgress = (ProgressBar) findViewById(R.id.storage_progress);
public void refreshInternalStorage() {
mTaskHandler.postDelayed(new Runnable() {
public void run() {
final long[] state = new long[3];
TimeUtil.getStorageState(Environment.getDataDirectory()
.getPath(), state);
refreshText(state);
}
}, 0);
}
private void refreshText(final long[] state) {
LogUtil.d("total="+state[0]+" free="+state[1]+" used="+state[2]+" progress="+(int) (state[2] * 100 / state[0]));
// postDelayed(new Runnable() {
// public void run() {
final Resources res = getResources();
mProgress.setProgress(13);//(int) (state[2] * 100 / state[0])
mTotal.setText(String.format(res.getString(R.string.apps_total,
TimeUtil.sizeToString(getContext(), state[0]))));
mUsed.setText(String.format(res.getString(R.string.apps_used,
TimeUtil.sizeToString(getContext(), state[2]))));
// mUsed.setText(R.string.apps_used);
// }
// }, 0);
}
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@android:id/background"
android:drawable="@drawable/progressbar_bg"/>
<item
android:id="@android:id/progress"
android:drawable="@drawable/progressbar"/>
</layer-list>
5-30:
問題描述:啓動一個activity時動畫界面卡。
解決方法:儘量不要在剛啓動時加載一些耗時的東東,用延時解決
問題描述:onPreferenceTreeClick onPreferenceChange的區別
onPreferenceTreeClick:能設置到任意的preference類型的變量中,單擊preference時觸發事件。
onPreferenceChange:只能設置到ListPreference類型的變量中,在彈出的list列表中觸發事件。
ListPreference自己有一個框架user在彈出的list列表中做出的選擇,會到一個Preference_id名的sharepreference中保存。
5-29:
問題描述:長按調節聲音大小,會出現不響聲音的現象
解決方法:使用handler解決,當這次聲音還沒播完下一次播放聲音請求又到達,先到handler中remove掉這一次的播放線程,再發送播放聲音的請求。
if (mVolumn.isMyChild(child)) {
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
Integer.parseInt(newVal), 0);
mVolHandler.removeMessages(PLAY_PROMPT_MUSIC);
mVolHandler.sendEmptyMessage(PLAY_PROMPT_MUSIC);
}
private Handler mVolHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case PLAY_PROMPT_MUSIC:
playVolunmChangeMusic();
break;
default:
break;
}
}
};
private void playVolunmChangeMusic() {
LogUtil.d("mNoMusic=" + mNoMusic);
if (mNoMusic) {
mNoMusic = false;
return;
}
if (mPlayer != null) {
try {
mPlayer.start();
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
}