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();
}
}
}