Android關於ListView中item與控件搶奪焦點的那些事


  • 在開發中,listview可以說是我們使用最頻繁的控件之一了,但是關於listview的各種問題也是很多。當我們使用自定義布局的Listview的時候,如果在item的布局文件里面存在Button或者是CheckBox等控件以及其子類控件的時候,經常會碰到各種控件的點擊事件沖突的情況,那么我們如何來處理Listview中這種控件之間焦點沖突的情況呢?

    我們以item存在一個Button控件為例

    \

    首先,加入我們不設置任何關於焦點的屬性,比如focus等,代碼如下

     

    01. @Override
    02. public View getView(int position, View convertView, ViewGroup parent) {
    03. convertView = inflater.inflate(R.layout.item, null);
    04.  
    05. Button btnButton = (Button) convertView.findViewById(R.id.btn);
    06. btnButton.setOnClickListener(new OnClickListener() {
    07.  
    08. @Override
    09. public void onClick(View v) {
    10.  
    11. Toast.makeText(context, "點擊了按鈕"0).show();
    12.  
    13. }
    14. });
    15.  
    16. return convertView;
    17. }

     

    設置listview的OnitemClickListener事件


    1. @Override
    2. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    3. Toast.makeText(context, "點擊了Item"0).show();
    4. }

    那么在上面這種情況下,我們可以觸發Button的點擊事件,但是item的點擊事件並不會被觸發,也就是說,Button控件搶奪了item的焦點事件,使得item不能觸發相應的點擊事件,那么,如果我們既想觸發Button的點擊事件,又想觸發item的點擊事件,我們應該怎么做呢?

    這里有三種解決方案

    1.將ListView中的Item布局中的子控件focusable屬性設置為false
    2.在getView方法中設置button.setFocusable(false)

    3.設置item的根布局的屬性android:descendantFocusability="blocksDescendant"

    我們可以發現,其實這三種方法都是為了讓Button等控件不能獲取焦點,從而使得item可以響應點擊事件。

    第三種方法使用起來相對方便,因為它是將item布局中的其他所有控件都設置為不能獲取焦點。

    android:descendantFocusability屬性共有三個取值,分別為

    beforeDescendants:viewgroup會優先其子類控件而獲取到焦點
    afterDescendants:viewgroup 只有當其子類控件不需要獲取焦點時才獲取焦點
    blocksDescendants:viewgroup 會覆蓋子類控件而直接獲得焦點


  • 免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM