Android成長實戰系列文章之ListView Item和Button點選事件的衝突原因和解決方案
阿新 • • 發佈:2018-12-23
筆者熱衷於技術,也是一名在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”