2016年2月10日 星期三

把 Button 當作 ToggleButton 使用


今日嘗試製作過濾形式的選單;點擊其中一顆按鈕,它會開著,其他的會關閉。最合適應該是 ToggleButton,但用 Button 感覺上較為得心應手,於是選擇了 Button。外觀方面,今次在 XML 中定義了「All」按鈕,其他的改為程序中生成;很容便做到:
//  Add filter button
Drawable drawable = resources.getDrawable(R.drawable.button_filter);
int size = subCategoryList.size();
for (int i=0; i<size; i++)  {

   category = subCategoryList.get(i);
   int subCategoryID = category.categoryID();

   String string = category.categoryName();
   string = _appManager.jsonStringForKey(string);

   LinearLayout.LayoutParams layoutParameter = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
   layoutParameter.setMarginStart(margin);

   String tag = Integer.toString(BUTTON_TAG_ALL+1+subCategoryID);

   button = new Button(_activity);
   button.setId(BUTTON_TAG_ALL+1+subCategoryID);
   button.setTag(tag);
   button.setText(string);
   button.setTextColor(color);
   button.setBackground(drawable);
   button.setLayoutParams(layoutParameter);
   button.setPadding(horizontal, vertical, horizontal, vertical);
   button.setOnClickListener(_onClickListener);
   button.setSelected(false);
   if (_typefaceSourceSanProLight != null)  {button.setTypeface(_typefaceSourceSanProLight);}
   linearLayout.addView(button);

   //  Add button object to array for ON/OFF use
   _buttonArray.add(button);
}
可是卻發生狀況。除了「All」按鈕能正常的開及關外,其他的不正常。例如明明點擊的是「Water」,「Syrup」卻開著了;當放開手時,「Water」開著,「Syrup」還是開著。功能上能正常過濾下方的 ListView,但外觀上卻不對。花了整個下午,最終發現錯誤是由 Drawable 導致。Drawable 那句要放在迴圈內。把不變的 Drawable 送在迴圈外,是為了效能的考量;原來在 Android 下 Drawable 那句是會變的。改成以下順序便解決了問題。又上了一課。
//  Add filter button
int size = subCategoryList.size();
for (int i=0; i<size; i++)  {

   category = subCategoryList.get(i);
   int subCategoryID = category.categoryID();

   String string = category.categoryName();
   string = _appManager.jsonStringForKey(string);

   LinearLayout.LayoutParams layoutParameter = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
   layoutParameter.setMarginStart(margin);

   String tag = Integer.toString(BUTTON_TAG_ALL+1+subCategoryID);

   Drawable drawable = resources.getDrawable(R.drawable.button_filter);

   button = new Button(_activity);
   button.setId(BUTTON_TAG_ALL+1+subCategoryID);
   button.setTag(tag);
   button.setText(string);
   button.setTextColor(color);
   button.setBackground(drawable);
   button.setLayoutParams(layoutParameter);
   button.setPadding(horizontal, vertical, horizontal, vertical);
   button.setOnClickListener(_onClickListener);
   button.setSelected(false);
   if (_typefaceSourceSanProLight != null)  {button.setTypeface(_typefaceSourceSanProLight);}
   linearLayout.addView(button);

   //  Add button object to array for ON/OFF use
   _buttonArray.add(button);
}

沒有留言: