2012-07-05 55 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