的Android SAX解析器显示的TextView
问题描述:
只有一线
我对我与Android和Java 并有很少的经验,第一个项目工作。 我有一台收音机播放器(启动和停止按钮激活服务) 和 一些数据来自像艺术家名称和专辑装在一个TextView 我用一个定时器,使得与歌曲的GUI更新起到的Android SAX解析器显示的TextView
一个xml文件这一切工作 只有当歌词TextView的加载它只显示XML标记<LYRIC>
这是我的主要活动的第一行:
extends Activity implements OnClickListener{
private static final String TAG = "ServicesDemo";
public String myimageURL;
private EditText Lyrics;
private ImageView AlbumPic;
private Button play, stop;
private TextView Artist, Song, Album, News, Lyric;
private UpdateTimeTask m_updateTime;
private Handler m_handler;
Parser data;
/** The delay in milliseconds between updates. */
private final int DELAY = 20000;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Artist =(TextView)findViewById(R.id.tvArtist);
Song =(TextView)findViewById(R.id.tvSongTitle);
Album =(TextView)findViewById(R.id.tvAlbum);
play = (Button) findViewById(R.id.play);
stop = (Button) findViewById(R.id.stop);
Lyrics = (EditText) findViewById(R.id.tvLyrics);
News = (TextView)findViewById(R.id.tvAnouncement);
AlbumPic = (ImageView) findViewById(R.id.AlbumPic);
play.setOnClickListener(this);
stop.setOnClickListener(this);
m_updateTime = new UpdateTimeTask();
m_handler = new Handler();
m_handler.post(m_updateTime);
}
private class UpdateTimeTask implements Runnable {
public void run() {
try {
SAXParserFactory saxPF = SAXParserFactory.newInstance();
SAXParser saxP = saxPF.newSAXParser();
XMLReader xmlR = saxP.getXMLReader();
URL url = new URL("http://www.mysite.com/AndroidTest.php");
XMLHandler myXMLHandler = new XMLHandler();
xmlR.setContentHandler(myXMLHandler);
xmlR.parse(new InputSource(url.openStream()));
} catch (Exception e) {
System.out.println(e);
}
data = XMLHandler.data;
for (int i = 0; i < data.getTitle().size(); i++) {
Lyrics.setText(data.getLyric().get(i));
myimageURL = data.getPic().get(i);
Song.setText("Title = "+data.getTitle().get(i));
Artist.setText("Artist = "+data.getArtist().get(i));
Album.setText("Album = "+data.getAlbum().get(i));
}
downloadFile(myimageURL);
}
Bitmap bmImg;
void downloadFile(String fileUrl) {
URL myFileUrl = null;
try {
myFileUrl = new URL(fileUrl);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
HttpURLConnection conn = (HttpURLConnection) myFileUrl
.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
bmImg = BitmapFactory.decodeStream(is);
AlbumPic.setImageBitmap(bmImg);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
m_handler.postDelayed(m_updateTime, DELAY);
AlbumPic.clearAnimation();
}
}
我的XML代码
<?xml version="1.0"?>
<CATALOG>
<CD>
<LYRIC>Stop that train: I'm leavin' - today!
Stop that train: I'm leavin' - anyway!
Stop that train: I'm leavin'. and I said:
It won't be too long whether I'm right or wrong;
I said, it won't be too long whether I'm right or wrong.
All my good life I've been a lonely man,
Teachin' my people who don't understand;
And even though I tried my best,
I still can't find no happiness.
So I got to say:
Stop that train: I'm leavin' - oh, baby now!
Stop that train: I'm leavin' - don't care what you say!
Stop that train: I'm leavin'. and I said:
It won't be too long whether I'm right or wrong;
Said, it won't be too long whether I'm right or wrong.
Some goin' east; and-a some goin' west,
Some stand aside to try their best.
Some livin' big, but the most is livin' small:
They just can't even find no food at all.
I mean, stop it:
Stop that train: I'm leavin' - leavin', mm-hmm.
Stop that train: I'm leavin' - I don't mind!
Stop that train: I'm leavin'. and I said:
It won't be too long whether I'm right or wrong;
I said it won't be too long whether I'm right or wrong.
Stop that train: I'm leavin' - leavin'!
Stop that train: I'm leavin' - can't take it!
Stop that train: I'm leavin' - got to be better!
It won't be too long whether I'm right or wrong;
I said it won't be too long whether I'm right or wrong.</LYRIC>
<ARTIST>Bob Marley</ARTIST>
<TITLE>Stop That Train</TITLE>
<ALBUM>Talkin blues</ALBUM>
<PIC>http://www.mysite.com/Android/Radio/AlbumCovers/Bob-Marley-Talkin-blues.jpg</PIC>
</CD>
</CATALOG>
我也尝试加载使用的EditText歌词但它也只显示<LYRIC>
标签的第一行
能有人给一些建议如何显示在TextView的整个文本
感谢
我xmlhandler
public class XMLHandler extends DefaultHandler {
String elementValue = null;
Boolean elementOn = false;
public static Parser data = null;
public static Parser getXMLData() {
return data;
}
public static void setXMLData(Parser data) {
XMLHandler.data = data;
}
/**
* This will be called when the tags of the XML starts.
**/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
elementOn = true;
if (localName.equals("CATALOG"))
{
data = new Parser();
} else if (localName.equals("CD")) {
/**
* We can get the values of attributes for eg. if the CD tag had an attribute(<CD attr= "band">Akon</CD>)
* we can get the value "band". Below is an example of how to achieve this.
*
* String attributeValue = attributes.getValue("attr");
* data.setAttribute(attributeValue);
*
* */
}
}
/**
* This will be called when the tags of the XML end.
**/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
elementOn = false;
/**
* Sets the values after retrieving the values from the XML tags
* */
if (localName.equalsIgnoreCase("title"))
data.setTitle(elementValue);
else if (localName.equalsIgnoreCase("artist"))
data.setArtist(elementValue);
else if (localName.equalsIgnoreCase("album"))
data.setAlbum(elementValue);
else if (localName.equalsIgnoreCase("lyric"))
data.setLyric(elementValue);
else if (localName.equalsIgnoreCase("pic"))
data.setPic(elementValue);
}
/**
* This is called to get the tags value
**/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (elementOn) {
elementValue = new String(ch, start, length);
elementOn = false;
}
}
public void post(Runnable mUpdate) {
// TODO Auto-generated method stub
}
public void removeCallbacks(Runnable sendUpdatesToUI) {
// TODO Auto-generated method stub
}
public void postDelayed(Runnable runnable, int i) {
// TODO Auto-generated method stub
}
}
答
我建议你检查你XMLHandler对象。我怀疑你在那里有什么问题。
如果您可以向我们展示您的XMLHandler类,它可以更好地帮助您。
编辑:
我已经做了一些修改到您的处理。我想你在阅读元素值时可能会遇到问题。改用CharArrayWriter(我已经解决了一个相同的问题)。 我想你不需要“elementOn”太多。如果它的一个非必要变量就是不使用它。 请确保您有过在你的XML布局定义的multine TextView的。 希望它的工作原理:-)
public class XMLHandler extends DefaultHandler {
private static final String TAG = "XMLHandler";
private String elementValue = null;
public static Parser data = null;
/** The contents. */
private CharArrayWriter contents = new CharArrayWriter();
public static Parser getXMLData() {
return data;
}
public static void setXMLData(Parser data) {
XMLHandler.data = data;
}
/**
* This will be called when the tags of the XML starts.
**/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
/**It´s a good practice to reset the CharArrayWriter when you start any element.*/
contents.reset();
if (localName.equals("CATALOG"))
{
data = new Parser();
} else if (localName.equals("CD")) {
/**
* We can get the values of attributes for eg. if the CD tag had an attribute(<CD attr= "band">Akon</CD>)
* we can get the value "band". Below is an example of how to achieve this.
*
* String attributeValue = attributes.getValue("attr");
* data.setAttribute(attributeValue);
*
* */
}
}
/**
* This will be called when the tags of the XML end.
**/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
/**
* Sets the values after retrieving the values from the XML tags
* */
String elementValue = contents.toString().trim();
if (localName.equalsIgnoreCase("title"))
data.setTitle(elementValue);
else if (localName.equalsIgnoreCase("artist"))
data.setArtist(elementValue);
else if (localName.equalsIgnoreCase("album"))
data.setAlbum(elementValue);
else if (localName.equalsIgnoreCase("lyric"))
data.setLyric(elementValue);
else if (localName.equalsIgnoreCase("pic"))
data.setPic(elementValue);
}
/**
* This is called to get the tags value
**/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
contents.write(ch, start, length);
}
@Override
public void endDocument() throws SAXException {
Log.i(TAG, "Catalog parse finalized with success.");
}
}
感谢您的建议 – user1505173 2012-07-05 23:30:18
非常欢迎。让我知道你的进度... 让我看看你的代码,以帮助你去的错误。 – yugidroid 2012-07-05 23:51:29
我编辑我的帖子上面,并包括xmlhandler的代码,我只理解了一半正在发生的事情,也许它必须做我的xml文件本身。我第一次遇到问题,得到的图片加载时,以“as_”开始的jpg文件的名称我动态地更改了所有jpg文件名,并且该问题已解决,但现在歌词 – user1505173 2012-07-06 12:09:47