当前位置: 代码迷 >> Android >> Android应用之《宋词三百首》(2)
  详细解决方案

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

热度:82   发布时间:2016-04-28 05:47:23.0
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的内容:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@id/ll_parent"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:background="@drawable/bg4"    android:orientation="vertical" >    <RelativeLayout        android:layout_width="fill_parent"        android:layout_height="46.0dip"        android:background="@drawable/toolbar" >        <TextView            android:id="@id/tv_app_title"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerHorizontal="true"            android:layout_centerVertical="true"            android:text="@string/app_name"            android:textAppearance="?android:textAppearanceLarge"            android:textColor="#ffffffff" />        <Button            android:id="@id/btn_back"            android:layout_width="72.0dip"            android:layout_height="46.0dip"            android:layout_alignParentLeft="true"            android:layout_centerVertical="true"            android:background="@drawable/btn_left"            android:paddingLeft="6.0dip"            android:text="@string/back"            android:textColor="#ffffffff"            android:textSize="14.0sp" />        <ImageView            android:id="@id/iv_font_small"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_alignParentRight="true"            android:layout_centerVertical="true"            android:src="@drawable/font_small" />        <ImageView            android:id="@id/iv_font_big"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerVertical="true"            android:layout_toLeftOf="@id/iv_font_small"            android:src="@drawable/font_big" />    </RelativeLayout>    <ScrollView        android:id="@id/scrollView1"        android:layout_width="fill_parent"        android:layout_height="0.0dip"        android:layout_margin="8.0dip"        android:layout_weight="1.0"        android:background="@drawable/item_bg2" >        <LinearLayout            android:id="@id/linearLayout1"            android:layout_width="fill_parent"            android:layout_height="fill_parent"            android:orientation="vertical" >            <TextView                android:id="@id/tv_title"                style="@style/black_normal"                android:layout_width="fill_parent"                android:layout_height="wrap_content"                android:layout_margin="5.0dip"                android:text="标题"                android:textAppearance="?android:textAppearanceMedium" />            <LinearLayout                android:layout_width="fill_parent"                android:layout_height="1.0px"                android:layout_marginLeft="5.0dip"                android:layout_marginRight="5.0dip"                android:background="#ff666666" />            <TextView                android:id="@id/tv_author"                style="@style/black_normal"                android:layout_width="fill_parent"                android:layout_height="wrap_content"                android:layout_margin="5.0dip"                android:text="作者"                android:textAppearance="?android:textAppearanceSmall" />            <LinearLayout                android:layout_width="fill_parent"                android:layout_height="1.0px"                android:layout_marginLeft="5.0dip"                android:layout_marginRight="5.0dip"                android:background="#ff666666" />            <TextView                android:id="@id/tv_desc"                style="@style/black_normal"                android:layout_width="fill_parent"                android:layout_height="fill_parent"                android:layout_margin="5.0dip"                android:lineSpacingMultiplier="1.3"                android:text="注解"                android:textAppearance="?android:textAppearanceSmall" />        </LinearLayout>    </ScrollView></LinearLayout>
这里,我们可以发现,一首宋词的标题、作者、内容分别对应三个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;		//字体变小按钮	private ImageView fontSmallImageView;	//字体变大按钮	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;		//代表返回按钮	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;			}		}	}

搜索界面截图如下:



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

Android应用之《宋词三百首》


  相关解决方案