Android移动编程实用教程 部分源程序(15188).doc_第1页
Android移动编程实用教程 部分源程序(15188).doc_第2页
Android移动编程实用教程 部分源程序(15188).doc_第3页
Android移动编程实用教程 部分源程序(15188).doc_第4页
Android移动编程实用教程 部分源程序(15188).doc_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

4.5 创建一个现代战争演习模拟管理信息系统在下面的例子中,将会创建一个工具,它使用一个FoxGS战争演习feed来显示最近发生的战争演习的列表。提示:在后面的章节中,还会多次回到这个战争演习应用程序。首先是在第5章,将使用一个内容提供器来保存和共享战争演习数据;然后是第6章和第7章,将添加地图支持并把战争演习更新程序转移到后台服务。在这个例子中,将会创建一个基于列表的活动,它可以连接到一个战争演习feed,并显示它所包含的战争演习的位置、级别和时间。本示例将使用一个Alert Dialog来提供细节窗口,该窗口包含了一个含有超链接的Text View,其中有一条指向FoxGS网站的链接。(1)创建一个FoxWar项目,该项目使用了FoxWar活动。修改main.xml布局资源来包含一个ListView控件一定要保证对它进行命名,这样就可以在活动代码中加以引用。(2)创建一个新的公有War类,这个类用来存储每一次战争演习的详细信息(日期、细节、位置、级别和链接)。重写toString方法来提供ListView中的每一个战争演习所使用的字符串。package com.paad.FoxWar;import java.util.Date;import java.text.SimpleDateFormat;import android.location.Location;public class War private Date date; private String datails; private Location location; private double magnitude; private String link; public Date getDate() return date; public String getDatails() return details; public Location getLocation() return location; public double getMagnitude() return magnitude; public String getLink() return link; pulbic War(Data _d,String _det,Location _loc,double _mag, String _link) date = _d; details = _det; location = _loc; magnitude = _mag; link = _link; Override public String toString() SimpleDateFormat sdf = new SimpleDateFormat( HH.mm); String dateString = sdf.format(date); return dateString + : + magnitude + + details; (3)在FoxWar活动中,重写onCreate方法来存储一个War对象的数组,并使用ArrayAdapter将这个数组绑定到ListView。import java.io.IOException;import java.io.InputStream;import .HttpURLConnection;import .MalformedURLException;import .URL;import .URLConnection;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.GregorianCalendar;import java.xml.parsers.DocumentBuilder;import java.xml.parsers.DocumentBuilderFactory;import java.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;import android.app.Activity;import android.app.Dialog;import android.location.Location;import android.os.Bundle;import android.view.Menu;import android.view.View;import android.view.WindowManager;import android.view.MenuItem;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.AdapterView.OnItemClickListener;public class FoxWar extends Activity ListView FoxWarListView;ArrayAdapter aa;ArrayList FoxWars = new ArrayList ();Overridepulbic void onCreate(Bundle icicle) super.onCreate(icicle); setContentView(R.layout.main); FoxWarListView = (ListView)this.findViewById(R.id.FoxWarListView); int layoutID = android.R.layout.simple_list_item_1; aa = new ArrayAdapter(this,layoutID,FoxWars); FoxWarListView.setAdapter(aa); (4)处理战争演习feed。在这个例子中所使用的feed是1天时间之内FoxGS的级别大于两个团的战争演习feed。提示:这里可以将feed的位置作为外部字符串资源进行添加,这样做能让你根据用户的位置来指定一个不同的feed。 FoxWar http:/FoxWar.FoxGS.gov/fwcenter/catalogs/lday-T2.xml (5)在应用程序访问Internet之前,它需要被赋予Internet访问的权限。因此,向清单中添加uses-permission权限。(6)返回FoxWar活动,创建一个新的refreshFoxWars方法,连接到战争演习feed并对其进行分析。提取每一个战争演习,并通过分析其详细信息来获得日期、级别、链接和位置。当分析完每一个战争演习之后,把它传递给一个新的addNewWar方法。提示:这里对给出的XML分析不做过多的注释。private void refreshFoxWars() /获得XML URL url; try String WarFeed = getString (R.string.War_feed); url = new URL(WarFeed); URLConnection conection; connection = url.openConnection(); HttpURLConnectioin httpConnection = (HttpURLConnection)connection; int responseCode = httpConnection.getResponseCode(); if (responseCode = =HttpURLConnection.HTTP_OK) InputStream in = httpConnection.getInputStream(); DocumentBuilderFactory dbf; dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); /解析FoxWar数据 Document dom = db.parse(in); Element docEle = dom.getDocumentElement(); /清空旧的战争演习 FoxWars.clear(); /获得每一个战争演习条目的列表 NodeList nl = docEle.getElementsBYTagName( entry); if (nl ! = null & nl.getLength() 0) for(int i = 0; i nl.getLength(); i +) Element entry = (Element) nl.item( i ); Element title = (Element)entry.getElementsByTagName( title).item(0); Element g = (Element)entry.getElementsByTagName( georss:point).item(0); Element when = (Element)entry.getElementsByTagName( updated).item(0); Element link = (Element)entry.getElementsByTagName( link).item(0); String details = title.getFirstChild().getNodeValue(); String hostname = http:/FoxWar.FoxGS.gov; String linkString = hostname + link.getAttribute( href); String point = g.getFirstChild().getNodeValue(); String dt = when.getFirstChild().getNodeValue(); SimpleDateFormat sdf; sdf = new SimpleDateFormat ( yyyy-MM-dd Thh:mm:ss Z ); Date qdate = new GregorianCalendar(0,0,0).getTime(); try qdate = sdf.parse(dt); catch (parseException e) e.printStackTrace(); String location = point.split( ); Location l = new Location( dummyGPS); l.setLatitude(Double.parseDouble(location0); l.setLongitude(Double.parseDouble(location1); String magitudeString = details.split( )1; int end = magnitudeString.length()-1; double magnitude; magnitude = Double.parseDouble(magnitudeString.substring (0,end); details = details.split(,)1.trim(); War War = new War(qdate,details,1, magnitude,linkString); /处理一个新发现的战争演习 addNewWar(War); catch(MalformedURLException e) e.printStacktrace(); catch (IOException e) e.printStackTrace(); catch(ParserConfigurationException e) e.printStacktrace(); catch (SAXException e) e.printStackTrace(); finally private void addNewWar (War _War) /待实现:把战争演习添加到ArrayList中 (7)更新addNewWar方法,这样它就能获得每一个新的、已经过处理的战争演习,并把它添加到战争演习ArrayList中。它还应该通知Array Adapter,底层的数据已经发生改变了。private void addNewWar (War _War) /向战争演习列表中添加新的战争演习 FoxWars.add(_War); /通知ArrayAdapter发生的改变 aa.notifyDataSetChanged();(8)修改onCreate方法,在启动时调用refreshFoxWars。Overridepulbic void onCreate(Bundle icicle) super.onCreate(icicle); setContentView(R.layout.main); FoxWarListView = (ListView)this.findViewById(R.id.FoxWarListView); int layoutID = android.R.layout.simple_list_item_1; aa = new ArrayAdapter(this,layoutID,FoxWars); FoxWarListView.setAdapter(aa); refreshFoxWars();提示:Internet查找此时还是发生在主UI线程中。这是一种不好的形式,因为如果查找花费的时间超过一定的秒数,程序就会变得没有响应。在第7章中,将会介绍如何把更加昂贵的或费时的操作转移到后台线程中。(9)如果运行项目,应该能看到一个ListView,它显示了最近24小时之内级别大于两个团的战争演习。(10)只需要额外的两个步骤,就可以把它变成一个更加有用的应用程序。首先创建一个新的菜单项,让用户按需刷新战争演习feed。 为菜单项添加一个新的外部串。Refresh FoxWars 重写活动的onCreateOptionsMenu和onOptionsItemSelected方法,显示和处理刷新战争演习菜单项。static final private int MENU_UPDATE = Menu.FIRST;Overridepulbic boolean onCreateOptionsMenu(Meun menu) super.onCreateOptionsMenu(menu); menu.add(0,MENU_UPDATE, Menu.NONE, R.string.menu_update); return true;Overridepublic boolean onOptionsItemSelected(MenuItem item) super.onOptionsItemSelected(item); swith (item.getItemId() ) case (MENU_UPDATE): refreshFoxWars(); return true; return false;(11)添加一些交互,让用户在从列表中选择一个战争演习时,可以通过打开一个对话框来找到更多的详细信息。 为单击条目所显示的对话框创建一个新的War_details.xml布局资源。 修改onCreate方法并向ListView添加一个ItemClickListener,这样无论在任何时候,只要选择一条战争演习项,都会显示一个对话框。static final private int WAR_DIALOG = 1;War selectedWar;Overridepublic void onCreate(Bundle icicle) super.onCreate(icicle); setContentView(R.layout.main); FoxWarListView = (ListView)this.findViewById(R.id.FoxWarListView); FoxWarListView.setOnItemClickListener(new OnItemClickListener() public void onItemClick(AdapterView _av,View _v,int _index, long arg3) selectedWar = FoxWars.get(_index); showDialog(WAR_DIALOG); ); int layoutID = android.R.layout.simple_list_item_1; aa = new ArrayAdapter(this,layoutID,FoxWars); FoxWarListView.setAdapter(aa); refreshFoxWars(); 重写onCreateDialog和onPrepareDialog方法,创建和填充战争演习详细信息对话框。Ovrridepublic Dialog onCreateDialog(int id) switch(id) case(WAR_DIALOG): LayoutInflater li = LayoutInflater.form(this); View WarDetailsView = li.inflate(R.layout.War_details, null); AlertDialog.Builder WarDialog = new AlertDialog.Builder(this); WarDialog.setTitle( War Time); WarDialog.setView(WarDetailsView); return WarDialog.create(); return null;Ovrridepublic void onPrepareDialog(int id,Dialog dialog) switch(id) case(WAR_DIALOG); SimpleDateFormat sdf; sdf = new SimpleDateFormat( dd/MM/yyyy HH:mm:ss); String dateString = sdf.format(selectedWar.getDate(); String WarText = Mangitude + selectedWar.getMagnitude() + n +selectedWar.getDetails() + n + selectedWar.getLink(); AlertDialog WarDialog = (AlertDialog)dialog; quqkeDialog.setTitle ( dateString); TextView tv = (TextView)WarDialog.findViewById(R.id.WarDetailsTextView); tv.setText(WarText); break; 通过为对话框添加链接,使指向FoxGS的连接成为一个超链接。调整对话框的XML布局资源定义,使它包含一个autolink属性。 再次启动活动,当单击一个特定的战争演习时,会出现一个对话框,并且它会部分地遮挡下面的列表。5.2.3 为FoxWar系统创建一个Preferences页在第4章中已经创建了一个现代战争演习模拟管理信息系统(FoxWar),它可以基于一个Internet feed来显示最近发生的战争演习列表。在下面的例子中,将为这个战争演习查看器创建一个Preference页面,它可以让用户通过配置应用程序的设置来获得一个更加个性化的体验。该示例会提供开启自动更新、控制更新的频率及过滤显示的最小战争演习等级等选项。提示:本章后面的部分将通过创建内容提供器来保存以及与其他应用程序共享战争演习数据。(1)打开在第4章中创建的FoxWar项目。为在“Preference”屏幕中显示的标签添加新的字符串资源。同时,还要为一个新的目录项添加允许用户访问Preference屏幕的字符串。 FoxWar http:/FoxW/eqcenter/catalogs/lday-M2.5.xml Refresh FoxWars Auto Update? Update Frequency Minimum War Magnitude Preference(2)创建一个新的preference.xml布局文件来布局Preference活动的UI,其中包含一个复选框表示是否需要“自动更新”,并且包含Spinner来选择更新的频率和等级过滤器。 LinearLayout android:orientation = horizontal android:layout_width = fill_parent android:layout_height = wrap_content (3)在一个新的res/values/arrays.xml文件中创建4个新的数组,它们将用来记录更新频率和最小等级过滤器的值。 Every Minute 5 minutes 10 minutes 15 minutes Every Hour 3 5 6 7 8 3 5 6 7 8 1 5 10 15 60(4)创建Preference活动,它将被用来显示应用程序的首选项。通过重写onCreate来填充在第(2)步中创建的布局,并获得对复选框和两个Spinner控件的引用,然后调用populateSpinners存根。package com.paad.FoxWar;import android.app.Activity;import android.content.SharedPreference;import android.content.SharedPreference.Editor;import android.os.Bundle;import android.view.View;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.CheckBox;import android.widget.Spinner;public class Preference extends Activity CheckBox autoUpdate; Spinner updateFreqSpinner; Spinner magintudeSpinner; Override public void onCreate(Bundle icicle super.onCreate(icicle); setContentView(R.layout.preference); updateFreqSpinner = (Spinner)findViewById(R.id.spinner_update_freq); magitudeSpinner = (Spinner)findViewById(R.id.spinner_War_mag); autoUpdate = (CheckBox)findViewById(R.id.checkbox_auto_update); populateSpinners(); private void populateSpinners() (5)使用Array Adapter将每一个Spinner都绑定到与其对应的数组中,从而完成po-pulateSpinners方法。private void populateSpinners() /填充更新频率Spinner ArrayAdapter fAdapter; fAdapter = ArrayAdapter.createFromResource(this, R.array.update_freq_options, android.R.layout.simple_spinner_item); fAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); updateFreqSpinner.setAdapter(fAdapter); /填充最小等级Spinner ArrayAdapter mAdapter; mAdapter = ArrayAdapter.createFromResource(this, R.array.magnitude_options, android.R.layout.simple_spinner_item); mAdapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item); magnitudeSpinner.setAdapter(mAdapter);(6)添加公有静态字符串值来识别将要创建的命名的共享Preference,以及用来存储每一个Preference值的键。更新onCreate方法来检索命名的Preference,并调用updateUIFrom Preference。UpdateUIFromPreference方法通过对共享的Preference对象使用get方法来检索每一个Preference值,同时把它应用到当前的UI。public static final String USER_PREFERENCE = USER_PREFERENCE;public static final String PREF_AUTO_UPDATE = PREF_AUTO_UPDATE;public static final String PREF_MIN_MAG = PREF_MIN_MAG;public static final String PREF_UPDATE_FREQ = PREF_UPDATE_FREQ;SharedPreference prefs;Overridepublic void onCreate(Bundle icicle) super.onCreate(icicle); setContentView(R.layout.preference); updateFreqSpinner = (Spinner)findViewById(R.id.spinner_update_freq); magnitudeSpinner = (Spinner)findViewById(R.id.spinner_War_mag); autoUpdate = (CheckBox)findViewById(R.id.checkbox_auto_update); populateSpinners(); prefs = getSharedPreference(USER_PREFERENCE,Activity.MODE_PRIVATE); updateUIFromPreference();private void updateUIFromPreference() boolean autoUpChecked = prefs.getBoolean(PREF_AUTO_UPDATE,false); int updateFreqIndex = prefs.getInt(PREF_UPDATE_FREQ,2); int minMagIndex = prefs.getInt(PREF_MIN_MAG,0); updateFreqSpinner.setSelection(updateFreqIndex); magnitudeSpinner.setSelection(m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论