HappyIdiom之六(2)點擊動物類列表中的每一項以對話框的形式顯示該成語的詳細信息

目標:點擊動物類列表中的每一項以對話框的形式顯示該成語的詳細信息

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類裏。

 


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章