目标:点击动物类列表中的每一项以对话框的形式显示该成语的详细信息
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类里。