Intent と Parcelable を介して JAXP Node または Document を渡す方法はありますか? JAXP は Parcelable を実装していないため、答えはおそらくノーです。Parcelable を実装する DOM ライブラリはありますか? 誰かがその実例を提供できますか?
シリアル化はオプションではありません。厄介なパフォーマンスヒット。データを res/xml に保存することはできません。最終的には (プロジェクトの終わりまでに) ディスク上で暗号化する必要があります。Android の「コンパイル済み」XML アクセス ツールは、XML 全体の復号化をサポートしていません。もちろん、私はクラスでそれを自分で行うことができます。
XML を拡張するスターター コードを次に示します。私の目標は、ある ListView から別の ListView に Node または Document を渡し、リストを介して DOM を効果的にドリルダウンすることです。
マイ ドキュメントには、すべてのアクティビティで共有する必要がある情報が含まれています。各アクティビティは異なるノードにアクセスし、新しい情報を抽出します。グローバル経由でドキュメントを公開することを検討しましたが、複数のアクティビティがそのようにアクセスするのは安全ではないと思います。
また、以下の作業コードでは、Node を String ではなく 2 番目の 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);
}
});
}
}