Android应用之《宋词三百首》(二)

转载自:http://blog.csdn.net/bear_huangzhen/article/details/25274303


接上回,上回我们讲到MainActivity里面将所有的宋词标题和作者显示到界面的ListView中去,我们接下来的工作是通过点击ListView的Item跳转到ContentActivity里面去显示单个宋词的全部内容,跳转代码如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:18px;">// 为ListView的Item设置点击监听器  
  2.         mListView.setOnItemClickListener(new OnItemClickListener() {  
  3.   
  4.             @Override  
  5.             public void onItemClick(AdapterView<?> parent, View view,  
  6.                     int position, long id) {  
  7.                 // 将当前被点击的item所代表的诗词对象的引用赋给currentSongCi  
  8.                 Global.currentSongCi = scList.get(position);  
  9.                 // 进行界面跳转  
  10.                 Intent intent = new Intent(MainActivity.this,  
  11.                         ContentActivity.class);  
  12.                 startActivity(intent);  
  13.             }  
  14.         });</span>  

在这里,我用一个静态变量将所点击的ListView Item所代表的宋词记录下来,然后跳转到ContentActivity。


我们在来首先看一下ContentActivity的布局文件activity_content.xml的内容:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:id="@id/ll_parent"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:background="@drawable/bg4"  
  7.     android:orientation="vertical" >  
  8.   
  9.     <RelativeLayout  
  10.         android:layout_width="fill_parent"  
  11.         android:layout_height="46.0dip"  
  12.         android:background="@drawable/toolbar" >  
  13.   
  14.         <TextView  
  15.             android:id="@id/tv_app_title"  
  16.             android:layout_width="wrap_content"  
  17.             android:layout_height="wrap_content"  
  18.             android:layout_centerHorizontal="true"  
  19.             android:layout_centerVertical="true"  
  20.             android:text="@string/app_name"  
  21.             android:textAppearance="?android:textAppearanceLarge"  
  22.             android:textColor="#ffffffff" />  
  23.   
  24.         <Button  
  25.             android:id="@id/btn_back"  
  26.             android:layout_width="72.0dip"  
  27.             android:layout_height="46.0dip"  
  28.             android:layout_alignParentLeft="true"  
  29.             android:layout_centerVertical="true"  
  30.             android:background="@drawable/btn_left"  
  31.             android:paddingLeft="6.0dip"  
  32.             android:text="@string/back"  
  33.             android:textColor="#ffffffff"  
  34.             android:textSize="14.0sp" />  
  35.   
  36.         <ImageView  
  37.             android:id="@id/iv_font_small"  
  38.             android:layout_width="wrap_content"  
  39.             android:layout_height="wrap_content"  
  40.             android:layout_alignParentRight="true"  
  41.             android:layout_centerVertical="true"  
  42.             android:src="@drawable/font_small" />  
  43.   
  44.         <ImageView  
  45.             android:id="@id/iv_font_big"  
  46.             android:layout_width="wrap_content"  
  47.             android:layout_height="wrap_content"  
  48.             android:layout_centerVertical="true"  
  49.             android:layout_toLeftOf="@id/iv_font_small"  
  50.             android:src="@drawable/font_big" />  
  51.     </RelativeLayout>  
  52.   
  53.     <ScrollView  
  54.         android:id="@id/scrollView1"  
  55.         android:layout_width="fill_parent"  
  56.         android:layout_height="0.0dip"  
  57.         android:layout_margin="8.0dip"  
  58.         android:layout_weight="1.0"  
  59.         android:background="@drawable/item_bg2" >  
  60.   
  61.         <LinearLayout  
  62.             android:id="@id/linearLayout1"  
  63.             android:layout_width="fill_parent"  
  64.             android:layout_height="fill_parent"  
  65.             android:orientation="vertical" >  
  66.   
  67.             <TextView  
  68.                 android:id="@id/tv_title"  
  69.                 style="@style/black_normal"  
  70.                 android:layout_width="fill_parent"  
  71.                 android:layout_height="wrap_content"  
  72.                 android:layout_margin="5.0dip"  
  73.                 android:text="标题"  
  74.                 android:textAppearance="?android:textAppearanceMedium" />  
  75.   
  76.             <LinearLayout  
  77.                 android:layout_width="fill_parent"  
  78.                 android:layout_height="1.0px"  
  79.                 android:layout_marginLeft="5.0dip"  
  80.                 android:layout_marginRight="5.0dip"  
  81.                 android:background="#ff666666" />  
  82.   
  83.             <TextView  
  84.                 android:id="@id/tv_author"  
  85.                 style="@style/black_normal"  
  86.                 android:layout_width="fill_parent"  
  87.                 android:layout_height="wrap_content"  
  88.                 android:layout_margin="5.0dip"  
  89.                 android:text="作者"  
  90.                 android:textAppearance="?android:textAppearanceSmall" />  
  91.   
  92.             <LinearLayout  
  93.                 android:layout_width="fill_parent"  
  94.                 android:layout_height="1.0px"  
  95.                 android:layout_marginLeft="5.0dip"  
  96.                 android:layout_marginRight="5.0dip"  
  97.                 android:background="#ff666666" />  
  98.   
  99.             <TextView  
  100.                 android:id="@id/tv_desc"  
  101.                 style="@style/black_normal"  
  102.                 android:layout_width="fill_parent"  
  103.                 android:layout_height="fill_parent"  
  104.                 android:layout_margin="5.0dip"  
  105.                 android:lineSpacingMultiplier="1.3"  
  106.                 android:text="注解"  
  107.                 android:textAppearance="?android:textAppearanceSmall" />  
  108.         </LinearLayout>  
  109.     </ScrollView>  
  110.   
  111. </LinearLayout></span>  
这里,我们可以发现,一首宋词的标题、作者、内容分别对应三个TextView控件。

接着我们再来看一下ContentActivity的内容:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:18px;">package com.example.songcidemo.ui;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.text.Html;  
  7. import android.text.Spanned;  
  8. import android.util.Log;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.view.Window;  
  12. import android.widget.Button;  
  13. import android.widget.ImageView;  
  14. import android.widget.TextView;  
  15.   
  16. import com.example.songcidemo.R;  
  17. import com.example.songcidemo.bean.SongCi;  
  18. import com.example.songcidemo.util.Global;  
  19.   
  20. public class ContentActivity extends Activity {  
  21.   
  22.     private SongCi sc;  
  23.       
  24.     //字体变小按钮  
  25.     private ImageView fontSmallImageView;  
  26.     //字体变大按钮  
  27.     private ImageView fontBigImageView;  
  28.       
  29.     //代表作者TextView和主体TextView的文本文字大小默认值  
  30.     private float defaultTextSize;  
  31.     //代表当前标题TextView的文本文字大小  
  32.     private float currentTitleTextSize;  
  33.     //代表当前作者TextView和主体TextView的文本文字大小  
  34.     private float currentTextSize;  
  35.       
  36.     //代表标题TextView  
  37.     private TextView titleTextView;  
  38.     //代表作者TextView  
  39.     private TextView authTextView;  
  40.     //代表主要内容TextView  
  41.     private TextView descTextView;  
  42.       
  43.     //代表返回按钮  
  44.     private Button backBtn;  
  45.   
  46.     @Override  
  47.     protected void onCreate(Bundle savedInstanceState) {  
  48.         super.onCreate(savedInstanceState);  
  49.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  50.         setContentView(R.layout.activity_content);  
  51.   
  52.         setupViews();  
  53.     }  
  54.       
  55.     /** 
  56.      * 初始化界面 
  57.      */  
  58.     private void setupViews() {  
  59.           
  60.         //通过findviewbyid()方法获取三个TextView控件  
  61.         titleTextView = (TextView) findViewById(R.id.tv_title);  
  62.         authTextView = (TextView) findViewById(R.id.tv_author);  
  63.         descTextView = (TextView) findViewById(R.id.tv_desc);  
  64.           
  65.         //将currentSongCi赋给类变量sc  
  66.         sc = Global.currentSongCi;  
  67.         //通过get()方法获取标题、作者、内容的值   
  68.         String title = sc.getTitle();  
  69.         String auth = sc.getAuth();  
  70.         String desc = sc.getDesc();  
  71.           
  72.         //将宋词的内容显示到三个TextView控件  
  73.         titleTextView.setText(title);  
  74.         authTextView.setText(auth);  
  75.         //对字符串进行HTML格式化  
  76.         Spanned sp = Html.fromHtml(desc);  
  77.         descTextView.setText(sp);  
  78. //      descWebView.loadDataWithBaseURL("fake://not/needed", desc, "text/html",  
  79. //              "utf-8", "");  
  80.           
  81.         Log.v("ContentActivity""" + titleTextView.getTextSize());  
  82.         Log.v("ContentActivity""" + authTextView.getTextSize());  
  83.         Log.v("ContentActivity""" + descTextView.getTextSize());  
  84.           
  85.         //初始化字体大小变量  
  86.         defaultTextSize = 14;  
  87.         currentTitleTextSize = 20;  
  88.         currentTextSize = 14;  
  89.           
  90.         fontBigImageView = (ImageView) findViewById(R.id.iv_font_big);  
  91.         fontSmallImageView = (ImageView) findViewById(R.id.iv_font_small);   
  92.           
  93.         //为fontBigImageView设置监听器  
  94.         fontBigImageView.setOnClickListener(new OnClickListener() {  
  95.               
  96.             @Override  
  97.             public void onClick(View v) {  
  98.                 currentTitleTextSize++;  
  99.                 currentTextSize++;  
  100.                 if((currentTextSize-defaultTextSize) > 5){  
  101.                     currentTitleTextSize--;  
  102.                     currentTextSize--;  
  103.                 }else{  
  104.                     setFont();  
  105.                 }  
  106.             }  
  107.         });  
  108.           
  109.         //为fontSmallImageView设置监听器  
  110.         fontSmallImageView.setOnClickListener(new OnClickListener() {  
  111.               
  112.             @Override  
  113.             public void onClick(View v) {  
  114.                 currentTitleTextSize--;  
  115.                 currentTextSize--;  
  116.                 if((defaultTextSize-currentTextSize) > 5){  
  117.                     currentTitleTextSize++;  
  118.                     currentTextSize++;  
  119.                 }else{  
  120.                     setFont();  
  121.                 }  
  122.             }  
  123.         });  
  124.           
  125.         backBtn = (Button) findViewById(R.id.btn_back);  
  126.           
  127.         //为backBtn设置监听器  
  128.         backBtn.setOnClickListener(new OnClickListener() {  
  129.               
  130.             @Override  
  131.             public void onClick(View v) {  
  132.                 //返回到主界面  
  133.                 Intent intent = new Intent(ContentActivity.this, MainActivity.class);  
  134.                 startActivity(intent);  
  135.             }  
  136.         });  
  137.           
  138.     }  
  139.       
  140.     /** 
  141.      * 设置界面字体大小 
  142.      */  
  143.     private void setFont(){  
  144.         titleTextView.setTextSize(currentTitleTextSize);  
  145.         authTextView.setTextSize(currentTextSize);  
  146.         descTextView.setTextSize(currentTextSize);  
  147.     }  
  148.   
  149. }  
  150. </span>  

为了将desc里面的诸如<p><br>这写HTML元素体现出来,这里需要一点小小的转换,就是这句
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:18px;">Spanned sp = Html.fromHtml(desc);</span>  

这个Activity中还实现了一个功能就是可以改变界面文字的大小。

界面截图如下:



最后我们再来实现一个主界面的搜索功能,我的思想是这样的定义一个ArrayList<SongCi> resultList这样的链表,因为已经有了scList里面存储的是全部的宋词,用for循环遍历scList,将满足搜索条件的结果加入到resultList当中去,搜索完成后就将ListView显示resultList里面的内容,关键代码如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //为searchDialogBtn设置点击监听器  
  2.         searchDialogBtn.setOnClickListener(new OnClickListener() {  
  3.   
  4.             @Override  
  5.             public void onClick(View v) {  
  6.                 switch (currentSearchRadioButtonId) {  
  7.                 case R.id.radio0:  
  8.                     searchSongCi(SEARCH_TYPE_TITLE);  
  9.                     break;  
  10.                 case R.id.radio1:  
  11.                     searchSongCi(SEARCH_TYPE_AUTHOR);  
  12.                     break;  
  13.                 case R.id.radio2:  
  14.                     searchSongCi(SEARCH_TYPE_CONTENT);  
  15.   
  16.                 default:  
  17.                     break;  
  18.                 }  
  19.                 //将搜索对话框消失掉  
  20.                 if (searchDialog.isShowing()) {  
  21.                     searchDialog.dismiss();  
  22.                 }  
  23.                   
  24.                 //初始化结果列表适配器resultSongCiAdapter  
  25.                 if (resultSongCiAdapter == null) {  
  26.                     resultSongCiAdapter = new MainListViewAdapter(  
  27.                             MainActivity.this, resultList);  
  28.                 }else{  
  29.                     //通知适配器,源数据已改变  
  30.                     resultSongCiAdapter.notifyDataSetChanged();  
  31.                 }  
  32.   
  33.                 mListView.setAdapter(resultSongCiAdapter);  
  34.   
  35.             }  
  36.         });  

自定义方法的内容是:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.      * 通过传递过来的参数来搜索宋词结果 
  3.      *  
  4.      * @param searchType    按哪种条件(标题、词人、内容)进行搜索 
  5.      */  
  6.     private void searchSongCi(int searchType) {  
  7.           
  8.         //初始化resultList  
  9.         if (resultList == null) {  
  10.             resultList = new ArrayList<SongCi>();  
  11.         }else{  
  12.             resultList.clear();  
  13.         }  
  14.           
  15.         //获取搜索关键词  
  16.         String searchWords = searchEditText.getText().toString().trim();  
  17.         if (searchWords == null || searchWords.equals("")) {  
  18.             return;  
  19.         }  
  20.   
  21.         for (SongCi sc : scList) {  
  22.             switch (searchType) {  
  23.             case SEARCH_TYPE_TITLE:  
  24.                 String title = sc.getTitle();  
  25.                 //如果标题中包含关键词,就将当前的宋词对象加入到结果链表中  
  26.                 if (title.contains(searchWords)) {  
  27.                     resultList.add(sc);  
  28.                 }  
  29.                 break;  
  30.             case SEARCH_TYPE_AUTHOR:  
  31.                 String auth = sc.getAuth();  
  32.                 //如果作者名中包含关键词,就将当前的宋词对象加入到结果链表中  
  33.                 if (auth.contains(searchWords)) {  
  34.                     resultList.add(sc);  
  35.                 }  
  36.                 break;  
  37.             case SEARCH_TYPE_CONTENT:  
  38.                 String desc = sc.getDesc();  
  39.                 //如果内容中包含关键词,就将当前宋词对象加入到结果链表中  
  40.                 if (desc.contains(searchWords)) {  
  41.                     resultList.add(sc);  
  42.                 }  
  43.                 break;  
  44.   
  45.             default:  
  46.                 break;  
  47.             }  
  48.         }  
  49.   
  50.     }  

搜索界面截图如下:



最后附上整个项目的源码:

Android应用之《宋词三百首》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值