Android应用之《宋词三百首》(二)
接上回,上回我们讲到MainActivity里面将所有的宋词标题和作者显示到界面的ListView中去,我们接下来的工作是通过点击ListView的Item跳转到ContentActivity里面去显示单个宋词的所有内容,跳转代码例如以下:
// 为ListView的Item设置点击监听器 mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 将当前被点击的item所代表的诗词对象的引用赋给currentSongCi Global.currentSongCi = scList.get(position); // 进行界面跳转 Intent intent = new Intent(MainActivity.this, ContentActivity.class); startActivity(intent); } });
在这里,我用一个静态变量将所点击的ListView Item所代表的宋词记录下来,然后跳转到ContentActivity。
我们在来首先看一下ContentActivity的布局文件activity_content.xml的内容:
这里,我们能够发现,一首宋词的标题、作者、内容分别相应三个TextView控件。接着我们再来看一下ContentActivity的内容:
package com.example.songcidemo.ui; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.text.Html; import android.text.Spanned; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import com.example.songcidemo.R; import com.example.songcidemo.bean.SongCi; import com.example.songcidemo.util.Global; public class ContentActivity extends Activity { private SongCi sc; //字体变小button private ImageView fontSmallImageView; //字体变大button private ImageView fontBigImageView; //代表作者TextView和主体TextView的文本文字大小默认值 private float defaultTextSize; //代表当前标题TextView的文本文字大小 private float currentTitleTextSize; //代表当前作者TextView和主体TextView的文本文字大小 private float currentTextSize; //代表标题TextView private TextView titleTextView; //代表作者TextView private TextView authTextView; //代表主要内容TextView private TextView descTextView; //代表返回button private Button backBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_content); setupViews(); } /** * 初始化界面 */ private void setupViews() { //通过findviewbyid()方法获取三个TextView控件 titleTextView = (TextView) findViewById(R.id.tv_title); authTextView = (TextView) findViewById(R.id.tv_author); descTextView = (TextView) findViewById(R.id.tv_desc); //将currentSongCi赋给类变量sc sc = Global.currentSongCi; //通过get()方法获取标题、作者、内容的值 String title = sc.getTitle(); String auth = sc.getAuth(); String desc = sc.getDesc(); //将宋词的内容显示到三个TextView控件 titleTextView.setText(title); authTextView.setText(auth); //对字符串进行HTML格式化 Spanned sp = Html.fromHtml(desc); descTextView.setText(sp); // descWebView.loadDataWithBaseURL("fake://not/needed", desc, "text/html", // "utf-8", ""); Log.v("ContentActivity", "" + titleTextView.getTextSize()); Log.v("ContentActivity", "" + authTextView.getTextSize()); Log.v("ContentActivity", "" + descTextView.getTextSize()); //初始化字体大小变量 defaultTextSize = 14; currentTitleTextSize = 20; currentTextSize = 14; fontBigImageView = (ImageView) findViewById(R.id.iv_font_big); fontSmallImageView = (ImageView) findViewById(R.id.iv_font_small); //为fontBigImageView设置监听器 fontBigImageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { currentTitleTextSize++; currentTextSize++; if((currentTextSize-defaultTextSize) > 5){ currentTitleTextSize--; currentTextSize--; }else{ setFont(); } } }); //为fontSmallImageView设置监听器 fontSmallImageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { currentTitleTextSize--; currentTextSize--; if((defaultTextSize-currentTextSize) > 5){ currentTitleTextSize++; currentTextSize++; }else{ setFont(); } } }); backBtn = (Button) findViewById(R.id.btn_back); //为backBtn设置监听器 backBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //返回到主界面 Intent intent = new Intent(ContentActivity.this, MainActivity.class); startActivity(intent); } }); } /** * 设置界面字体大小 */ private void setFont(){ titleTextView.setTextSize(currentTitleTextSize); authTextView.setTextSize(currentTextSize); descTextView.setTextSize(currentTextSize); } }
为了将desc里面的诸如<p><br>这写HTML元素体现出来,这里须要一点小小的转换,就是这句
Spanned sp = Html.fromHtml(desc);
这个Activity中还实现了一个功能就是能够改变界面文字的大小。
界面截图例如以下:
最后我们再来实现一个主界面的搜索功能,我的思想是这种定义一个ArrayList<SongCi> resultList这种链表,由于已经有了scList里面存储的是所有的宋词,用for循环遍历scList,将满足搜索条件的结果增加到resultList其中去,搜索完毕后就将ListView显示resultList里面的内容,关键代码例如以下:
//为searchDialogBtn设置点击监听器 searchDialogBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { switch (currentSearchRadioButtonId) { case R.id.radio0: searchSongCi(SEARCH_TYPE_TITLE); break; case R.id.radio1: searchSongCi(SEARCH_TYPE_AUTHOR); break; case R.id.radio2: searchSongCi(SEARCH_TYPE_CONTENT); default: break; } //将搜索对话框消失掉 if (searchDialog.isShowing()) { searchDialog.dismiss(); } //初始化结果列表适配器resultSongCiAdapter if (resultSongCiAdapter == null) { resultSongCiAdapter = new MainListViewAdapter( MainActivity.this, resultList); }else{ //通知适配器,源数据已改变 resultSongCiAdapter.notifyDataSetChanged(); } mListView.setAdapter(resultSongCiAdapter); } });
自己定义方法的内容是:
/** * 通过传递过来的參数来搜索宋词结果 * * @param searchType 按哪种条件(标题、词人、内容)进行搜索 */ private void searchSongCi(int searchType) { //初始化resultList if (resultList == null) { resultList = new ArrayList<SongCi>(); }else{ resultList.clear(); } //获取搜索关键词 String searchWords = searchEditText.getText().toString().trim(); if (searchWords == null || searchWords.equals("")) { return; } for (SongCi sc : scList) { switch (searchType) { case SEARCH_TYPE_TITLE: String title = sc.getTitle(); //假设标题中包括关键词,就将当前的宋词对象增加到结果链表中 if (title.contains(searchWords)) { resultList.add(sc); } break; case SEARCH_TYPE_AUTHOR: String auth = sc.getAuth(); //假设作者名中包括关键词,就将当前的宋词对象增加到结果链表中 if (auth.contains(searchWords)) { resultList.add(sc); } break; case SEARCH_TYPE_CONTENT: String desc = sc.getDesc(); //假设内容中包括关键词,就将当前宋词对象增加到结果链表中 if (desc.contains(searchWords)) { resultList.add(sc); } break; default: break; } } }
搜索界面截图例如以下:
最后附上整个项目的源代码: