1

有没有办法通过 Intent 和 Parcelable 传递 JAXP 节点或文档?JAXP 没有实现 Parcelable,所以答案可能是 --no。有没有实现 Parcelable 的 DOM 库?有人可以提供一个可行的例子吗?

序列化不是一种选择;令人讨厌的表现受到打击。将数据存储在 res/xml 中不是一种选择:它最终必须(在项目结束时)在磁盘上加密。Android 的“编译”XML 访问工具不支持解密整个 XML。当然,我可以自己上课。

这是我膨胀 XML 的起始代码。我的目标是将节点或文档从一个 ListView 传递到另一个,通过 Lists 有效地钻取 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);
            }
        });
    }
}
4

1 回答 1

-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;
}

}
于 2012-12-09T01:39:29.000 回答