2012-07-05 58 views
0
只有一线

我对我与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 

    } 

} 

回答

0

我建议你检查你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."); 
    } 
} 
+0

感谢您的建议 – user1505173 2012-07-05 23:30:18

+0

非常欢迎。让我知道你的进度... 让我看看你的代码,以帮助你去的错误。 – yugidroid 2012-07-05 23:51:29

+0

我编辑我的帖子上面,并包括xmlhandler的代码,我只理解了一半正在发生的事情,也许它必须做我的xml文件本身。我第一次遇到问题,得到的图片加载时,以“as_”开始的jpg文件的名称我动态地更改了所有jpg文件名,并且该问题已解决,但现在歌词 – user1505173 2012-07-06 12:09:47