1. 程式人生 > >Android成長實戰系列文章之ListView Item和Button點選事件的衝突原因和解決方案

Android成長實戰系列文章之ListView Item和Button點選事件的衝突原因和解決方案

筆者熱衷於技術,也是一名在Android方向上滾爬的程式設計師,以下是我技術總結系列文章:

此係列文章屬於Android成長實戰系列,主要以專案中實際用到的東西分享出來,更注重於實戰程式設計能力的培養。

在我們實際專案開發過程中難免遇到各種事件分發有關問題,通常我們遇到問題都會去網上大量尋找解決方案,為了便於筆者自己快速定位問題,所以筆者打算自己總結匯總,本篇文章屬於Android成長實戰系列文章之事件分發篇,主要是實戰一些日常開發過程遇到的各種事件分發問題。

在這裡插入圖片描述

ListView Item和Button點選事件的衝突原因和解決方案

1.ListView的Item和Button點選事件的衝突原因

  在Android事件分發機制中,存在焦點這麼一個概念,當你的ListView的Item中包含有Button,同時你給ListView設定了Item點選事件且Button也設定了點選事件,這個時候ListView的Item點選事件就會失效,原因很簡單,因為Button奪取了事件焦點,導致ListView的Item出現點選無效的情況。我們來段程式碼演示一下:

佈局檔案:

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

<ListView
    android:id="@+id/lv1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</LinearLayout>

MainActivity程式碼:

public class MainActivity extends AppCompatActivity {


private ListView lv1;

private ArrayList<String> strings = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    lv1 = findViewById(R.id.lv1);

    strings.add("a");
    strings.add("b");
    strings.add("c");
    strings.add("d");
    strings.add("e");
    strings.add("f");
    strings.add("g");
    strings.add("h");

    lv1.setAdapter(new BaseAdapter() {
        @Override
        public int getCount() {
            return strings.size();
        }

        @Override
        public Object getItem(int i) {
            return strings.get(i);
        }

        @Override
        public long getItemId(int i) {
            return i;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            Button button = new Button(MainActivity.this);
            button.setText(strings.get(i));
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(MainActivity.this,"點選了Button",Toast.LENGTH_SHORT).show();
                }
            });
            return button;
        }

    });

    lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Toast.makeText(MainActivity.this,"點選了Item",Toast.LENGTH_SHORT).show();
        }
    });



}

}

執行demo,並且點選ListView的Item:

在這裡插入圖片描述

2.解決方案

在ListView的介面卡中的佈局檔案中新增:

  • 1.在佈局檔案的根元素上中新增屬性android:descendantFocusability=“blocksDescendants”

  • 2.在Button中新增屬性android:focusable="false"和android:clickable=“true”