目標:點擊動物類列表中的每一項以對話框的形式顯示該成語的詳細信息
Step1:自定義彈出對話框的佈局showview.xml文件
<?xml version="1.0" encoding="utf-8"?>
<!-- 關於頁面的xml文件 -->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/bg_ling"
android:orientation="vertical" >
<TextView
android:id="@+id/show_idiom"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="false"
android:textColor="#000000"
android:textSize="20sp" />
</LinearLayout>
</ScrollView>
Step2:修改Study_AnimalActivity.java
public class Study_AnimalActivity extends ListActivity {
private List<Map<String, Object>> data;
private List<Idiom> idioms;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_study__animal);
getData();
SimpleAdapter simpleAdapter = new SimpleAdapter(this, data,
R.layout.study_animal_item, new String[] { "idiom" },
new int[] { R.id.idiom }) {
// 重了基類的getView()方法,將每一項的按鈕組件和對應的事件進行綁定
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
View view = super.getView(position, convertView, parent);
final ImageButton imageButton = (ImageButton) view
.findViewById(R.id.save);
imageButton.setFocusable(false);//這兩句是關鍵
imageButton.setFocusableInTouchMode(false);//這兩句是關鍵
imageButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(Study_AnimalActivity.this, "收藏嘍!",
Toast.LENGTH_LONG).show();
}
});
return view;
}
};
setListAdapter(simpleAdapter);
}
// 當點擊列表項的話彈出對話框,不知道爲何列表項中出現按鈕元素時,此方法就不起作用了?
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Idiom idiom = idioms.get(position);
String result = idiom.getIdiom() + "\n" + idiom.getSpell() + "\n【解釋】: "
+ idiom.getExplain() + "\n【近義詞】: " + idiom.getHomoionym()
+ "\n【反義詞】: " + idiom.getAntonym() + "\n【來源】: "
+ idiom.getDerivation() + "\n【示例】: " + idiom.getExamples()
+ "\n【英語翻譯】: " + idiom.getEnglish();
showDialog(result);
}
private void showDialog(String result) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater layoutInflater = LayoutInflater.from(this);
View view = layoutInflater.inflate(R.layout.showidiom, null);
builder.setView(view);
TextView textView = (TextView) view.findViewById(R.id.show_idiom);
textView.setText(result);
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_study__animal, menu);
return true;
}
private void getData() {
IdiomDao idiomDao = new AnimalDao(this);
idioms = idiomDao.getIdioms();
data = new ArrayList<Map<String, Object>>();
for (int i = 0; i < idioms.size(); i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("idiom", idioms.get(i).getIdiom());
data.add(map);
}
}
}
Step3:運行測試
Tip:這部分在測試時總是達不到想要的效果,點擊每個成語並不彈出對話框,通過google搜索發現是因爲在列表項中如果出現按鈕能夠獲取焦點的組件時,就會出現無法單擊每一列表項的情況。
解決辦法:使imageButton不能夠獲得焦點
imageButton.setFocusable(false);
imageButton.setFocusableInTouchMode(false);//這兩句是關鍵
分析:
由於除了動物類,其他類的成語當打開點擊每一項後都要彈出對話框,而這個對話框的效果是統一的,所以我們單獨將showDialog方法封裝到common包的DetailDialog類裏。