2012-05-30 21 views
2

我有一個活動,顯示可在應用程序中分配給活動事件的複選框(聚焦區域)列表。不過,我希望能夠阻止用戶表單編輯這些值,直到單擊按鈕將表單置於編輯模式。未鎖定自定義陣列適配器中的編輯模式時Android鎖定複選框

有人可以解釋或提供代碼示例如何將其實現到我的應用程序?

此列表在ListView中使用類型爲FocusArea的自定義ArrayAdapter爲我的應用程序創建了一個類。 該活動的XML如下所示:

 <?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" android:background="@drawable/horizontal_gradient_line_reverse"> 

    <TextView 
     android:id="@+id/textViewCustomerNameNumber" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:text="Customer Name &amp; Number" android:layout_margin="5dp"/> 

    <ListView 
     android:id="@+id/listViewFocusAreas" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/relativeLayoutControls" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/textViewCustomerNameNumber" 
     android:layout_margin="5dp" 
     android:background="@drawable/myborder" > 

    </ListView> 

    <RelativeLayout 
     android:id="@+id/relativeLayoutControls" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" > 


     <ImageView 
      android:id="@+id/imageViewCancelFocusAreaChanges" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:layout_alignParentTop="true" 
      android:src="@drawable/ic_mini_undo" /> 

     <ImageView 
      android:id="@+id/imageViewSaveFocusAreaChanges" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_toLeftOf="@+id/imageViewCancelFocusAreaChanges" 
      android:src="@drawable/ic_mini_save" /> 

     <ImageView 
      android:id="@+id/imageViewEditFocusArea" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_toLeftOf="@+id/imageViewSaveFocusAreaChanges" 
      android:src="@drawable/ic_mini_edit" /> 

    </RelativeLayout> 


    <ImageView 
     android:id="@+id/imageViewEditMode" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/textViewCustomerNameNumber" 
     android:layout_alignRight="@+id/listViewFocusAreas" 
     android:src="@drawable/edit16x16" 
     android:visibility="gone" /> 

</RelativeLayout> 

以下是焦點區域行的XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <CheckBox 
     android:id="@+id/checkBoxFocusArea" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Focus Area" /> 

</LinearLayout> 

以下是自定義ArrayAdapter的代碼:

public class FocusAreaAdapter extends ArrayAdapter<FocusArea> { 

    private ArrayList<FocusArea> focusAreas; 
    private Context context; 

    public FocusAreaAdapter(Context context, int textViewResourceId, ArrayList<FocusArea> focusAreas) { 
     super(context, textViewResourceId, focusAreas); 
     this.context = context; 
     this.focusAreas = focusAreas; 
    } 

    @Override 
    public View getView(final int position, View convertView, final ViewGroup parent) { 
     View v = convertView; 
     if(v == null) { 
      LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.focus_area_menu_item, null); 
     } 
     FocusArea focusArea = focusAreas.get(position); 

     if(focusArea != null) { 
      CheckBox cbFocusArea = (CheckBox)v.findViewById(R.id.checkBoxFocusArea); 
      cbFocusArea.setText(focusArea.getFocusAreaCodeDescription()); 
      if(focusArea.isFocusAreaCodeChecked() == 1) { 
       cbFocusArea.setChecked(true); 
      } else { 
       cbFocusArea.setChecked(false); 
      } 

      cbFocusArea.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
        FocusArea focusArea = focusAreas.get(position); 
        if(focusArea.isFocusAreaCodeChecked() == 1) { 
         focusArea.setFocusAreaCodeChecked(0); 
        } else { 
         focusArea.setFocusAreaCodeChecked(1); 
        } 
       } 
      }); 
     }  
     return v; 
    } 
} 

最後我使用以下代碼instanciate我的自定義陣列適配器:

private void assignFocusAreasToAdapter() { 
    // get reference to available responsibles list view control 
    lvFocusAreas.clearChoices(); 

    // create an array adapter with the communications data array 
    activityFocusAreaAdapter = new FocusAreaAdapter(this, R.layout.focus_area_menu_item, activityFocusAreas); 

    // assign the my customers list control the array adapter 
    lvFocusAreas.setAdapter(activityFocusAreaAdapter); 
    activityFocusAreaAdapter.notifyDataSetChanged(); 
    Log.i(TAG, "Available Activity Focus Areas Loaded"); 
} 

回答

2

好吧,我找到了解決這個問題的任何人可能有同樣的問題。

焦點區域活動的XML保持與上面發佈的相同。

的對焦區域行項目的XML相應修改:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:descendantFocusability="blocksDescendants" > 

    <CheckBox 
     android:id="@+id/checkBoxFocusArea" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Focus Area" /> 

</LinearLayout> 

你可以看到,這個現在有以下行添加android:descendantFocusability="blocksDescendants"這可以防止複選框onClickListener從點火通常會從阻止列表視圖OnItemClickedListener射擊。

自定義適配器代碼被修改以除去複選框OnClickListener像這樣:

public class FocusAreaAdapter extends ArrayAdapter<FocusArea> { 

    private ArrayList<FocusArea> focusAreas; 
    private Context context; 

    public FocusAreaAdapter(Context context, int textViewResourceId, ArrayList<FocusArea> focusAreas) { 
     super(context, textViewResourceId, focusAreas); 
     this.context = context; 
     this.focusAreas = focusAreas; 
    } 

    @Override 
    public View getView(final int position, View convertView, final ViewGroup parent) { 
     View v = convertView; 
     if(v == null) { 
      LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.focus_area_menu_item, null); 
     } 
     FocusArea focusArea = focusAreas.get(position); 

     if(focusArea != null) { 
      CheckBox cbFocusArea = (CheckBox)v.findViewById(R.id.checkBoxFocusArea); 
      cbFocusArea.setText(focusArea.getFocusAreaCodeDescription()); 
      if(focusArea.isFocusAreaCodeChecked() == 1) { 
       cbFocusArea.setChecked(true); 
      } else { 
       cbFocusArea.setChecked(false); 
      } 

      cbFocusArea.setClickable(false);    
     }  
     return v; 
    } 
} 

,張貼在上面,但必須添加一個OnItemClickListener到ListView和預製品的自定義適配器使用相同的代碼實例化檢查裏面的複選框的OnItemClickListener單擊像這樣的事件:

lvFocusAreas = (ListView)findViewById(R.id.listViewFocusAreas); 
    lvFocusAreas.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> adapter, View view, int position, long id) { 
      if(editMode){ 
       FocusArea focusArea = (FocusArea)lvFocusAreas.getItemAtPosition(position); 
       if(focusArea.isFocusAreaCodeChecked() == 0) { 
        focusArea.setFocusAreaCodeChecked(1); 
       } else { 
        focusArea.setFocusAreaCodeChecked(0); 
       } 
       activityFocusAreaAdapter.notifyDataSetChanged(); 
       setControlsEnabled(); 
      }    
     } 
    }); 

希望這有助於任何一個那有同樣的問題。 :D

+0

感謝您提供您的解決方案。在我的情況下,通過在[原始錯誤報告](http://code.google.com/p/)中建議的方式向根ViewGroup添加'android:descendantFocusability =「blocksDescendants」'來防止後代變得焦點,安卓/問題/細節?ID = 3414#C31)。 –