修 bug心得

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:

問題描述:1,當前網絡是有線連接時,到wifi頁面點擊開啓wifi按鈕,沒得提示。
  2,當前網絡是wifi連接時,到有線頁面點擊開啓有線按鈕,馬上到wifi頁面,則可看到wifi信號列表有閃爍現象。
開始修這個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();
			}
		}
	}


發佈了154 篇原創文章 · 獲贊 2 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章