2012-12-09 64 views
1

是否有任何方式通過意圖和Parcelable傳遞JAXP節點或文檔? JAXP沒有實現Parcelable,所以答案可能是 - 沒有。有沒有實現Parcelable的DOM庫?有人可以提供一個工作的例子嗎?有沒有什麼辦法通過Intent和Parcelable傳遞DOM對象?

序列化不是一種選擇;令人討厭的表現。將數據存儲在res/xml中不是一個選項:它最終(在項目結束時)必須在磁盤上加密。 Android的「編譯」XML訪問工具不支持解密整個XML。當然,我可以在課堂上自己做。

這是我的初學者代碼,它擴大了XML。我的目標是將節點或文檔從一個ListView傳遞到另一個ListView,從而有效地通過列表向下鑽取DOM。

我的文檔包含所有活動需要共享的信息。每個活動訪問不同的節點,並提取新的信息。我已經考慮過通過全球範圍公開文檔,但我不認爲多個活動以這種方式訪問​​它是安全的。

此外,在下面的工作代碼中,我打算將一個節點傳遞給第二個ListActivity而不是一個字符串,只是沒有得到那麼多。

package com.example 

import java.io.File; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

import android.app.ListActivity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.*; 
import android.widget.AdapterView.OnItemClickListener; 

public class JAXPListActivity extends ListActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Document doc = null; 
     try { 
      DocumentBuilderFactory factory = 
         DocumentBuilderFactory.newInstance(); 
      DocumentBuilder builder = factory.newDocumentBuilder(); 
      doc = builder.parse(new File("/sdcard/example.xml")); 

     } catch (Exception e) { 
      e.printStackTrace(); //TO-DO: exception handling 
     } 

     NodeList nodes = doc.getChildNodes(); 
     String[] nodeList = new String[nodes.getLength()]; 

     for(int i = 0; i<nodes.getLength(); i++) { 
      Node node = nodes.item(i); 
      nodeList[i] = nodes.item(i).getNodeName(); 
     } 

     this.setListAdapter(new ArrayAdapter<String>(this, 
       R.layout.list_item, 
       R.id.label, nodeList)); 

     ListView lv = getListView(); 

     lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
         int position, long id) { 

       String nodeName = ((TextView) view).getText().toString(); 

       Intent i = new Intent(getApplicationContext(), 
           JAXPNodeListActivity.class); 

       i.putExtra("nodeName", nodeName); 
       startActivity(i); 
      } 
     }); 
    } 
} 
+0

好吧,顯然通過Intents傳遞數據是不滿意的,顯然沒有putExtra()方法的Object。我仍然想知道是否有人用Parcelable實現重新打包DOM對象。也許我會試試看。 – yetimoner

+0

您可以嘗試使用:getIntent()。getSerializableExtra(nodeName) –

+0

該解決方案無法使用序列化:它是所述要求之一。 – yetimoner

回答

-1

您可以簡單地使用一個Singleton類。像:

public class DomObjectManager{ 

private static DomObjectManager INSTANCE; 
private Document doc; 

public static DomObjectManager getInstance(){ 

if(INSTANCE==null){ 
INSTANCE = new DomObjectManager(); 
} 
return INSTANCE; 
} 
private DomObjectManager(){ 
} 
//set the shared document; 
public void setDocument(Document doc){ 
this.doc = doc; 
} 
public void getDocument(){ 
retunr doc; 
} 
//call to destroy before when you do not need the singleton any more. 
public void destroy(){ 
INSTANCE == null; 
} 

} 
+0

單身人士被Android GC收穫,意味着他們可以在任何時候恢復爲空。另一個問題是刪除Intent.putExtra()的上下文消息傳遞方面。我的第二個ListActivity需要知道要引用哪個DOM部分(因爲這是一個向下鑽取)。傳遞一個Node類型的DOM對象會讓第二個活動繼續下降到文檔層次結構中。 – yetimoner

+0

強制它與銷燬方法爲null。 –

相關問題