0

plist(XML)ファイルから解析されたデータを表示するビューを作成しています。私の解析ルーチンは、後でキーを使用して取得するハッシュマップにデータをオブジェクトとして格納します。私のテキストビューはデータを表示しますが、\nを改行に処理しません。代わりに、\nがテキストとともに表示されます。ハッシュマップからデータを取得するために使用するコードは次のとおりです。

String contactData = dict.get("Data").toString();

私は成功せずにバリエーションを試しました:

Object obj =  dict.get("Data");
String contactData = obj.toString();
and
contactData = (String)dict.get("Data");

私のテキストは長く、\nは改行を強制するために埋め込まれています。テキストを次のように設定します。

TextView data = (TextView) getActivity().findViewById(R.id.data);
data.setText(contactData);

これが私のレイアウトです:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/light_grey"
android:orientation="vertical" >

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@color/midnight_blue"
    android:gravity="center"
    android:text="Contacts"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:textColor="@color/white"
    android:textStyle="bold" />

<TextView
    android:id="@+id/country"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:gravity="center"
    android:textColor="@color/midnight_blue"
    android:textSize="16dp" />

<TextView
    android:id="@+id/name"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:background="@color/white"
    android:gravity="center"
    android:textColor="@color/midnight_blue"
    android:textSize="16dp" />

<TextView
    android:id="@+id/data"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:gravity="center"
    android:singleLine="false"
    android:textColor="@color/black"
    android:textSize="12dp" 
    android:text="Line one\nLine two\nLine3"/>

\ nテキストを変数(contactData)にハードコーディングするか、レイアウトXMLファイルでデフォルトのテキストを使用すると、正常に機能します。オブジェクトデータをStringに変換すると機能しませんか?

\ r\nへの変換を提案しないでください。\nは行区切り文字です。私は前の質問でその線を下ったが、それは解決策ではなかった。次のコードは\nを返します。

System.getProperty("line.separator");

私の問題は、ハッシュマップからテキストを取得して文字列に変換する方法に関連しています。任意の考えや提案をいただければ幸いです!!!

*更新これがplistファイルの解析ルーチンです。

    public void parse(InputStream inputStream) throws XmlPullParserException, IOException {
    final XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
    final XmlPullParser parser = xppf.newPullParser();
    parser.setInput(inputStream, null);

    final Stack<List<Map<String, Object>>> arrayStack = new Stack<List<Map<String, Object>>>();
    final Stack<Map<String, Object>> dictStack = new Stack<Map<String, Object>>();
    final Stack<String> keyStack = new Stack<String>();

    int eventType = parser.getEventType();
    boolean done = false;
    while (!done) {
        final String name = parser.getName();
        switch (eventType) {
        case XmlPullParser.START_DOCUMENT:
            break;
        case XmlPullParser.START_TAG:
            if ("array".equalsIgnoreCase(name)) {
                final List<Map<String, Object>> array = new ArrayList<Map<String,Object>>();
                arrayStack.push(array);
            } else if ("dict".equalsIgnoreCase(name)) {
                final Map<String, Object> dict = new HashMap<String, Object>();
                dictStack.push(dict);
            } else if ("key".equalsIgnoreCase(name)){
                keyStack.push(parser.nextText()); // assign current key
            } else if ("string".equalsIgnoreCase(name)) {
                final Map<String, Object> dict = dictStack.peek();
                final String string = parser.nextText();
                final String key = keyStack.pop();
                dict.put(key, string);
            } else if ("integer".equalsIgnoreCase(name)) {
                final Map<String, Object> dict = dictStack.peek();
                final String integerStr = parser.nextText();
                final Integer integer = new Integer(integerStr);
                final String key = keyStack.pop();
                dict.put(key, integer);
            }  else if ("false".equalsIgnoreCase(name)) {
                final Map<String, Object> dict = dictStack.peek();
                final Boolean booleanValue = new Boolean(false);
                final String key = keyStack.pop();
                dict.put(key, booleanValue);
            } else if ("true".equalsIgnoreCase(name)) {
                final Map<String, Object> dict = dictStack.peek();
                final Boolean booleanValue = new Boolean(true);
                final String key = keyStack.pop();
                dict.put(key, booleanValue);
            }

            break;
        case XmlPullParser.END_TAG:
            if ("array".equalsIgnoreCase(name)) {
                final List<Map<String, Object>> array = arrayStack.pop();
                if (arrayStack.isEmpty()) {
                    // return array;
                    mPlistHashMap.put("array",array);
                    break;
                }
                // If not end of array, means it's an array within a dict
                final String key = keyStack.pop();
                dictStack.peek().put(key, array);
            } else if ("dict".equalsIgnoreCase(name)) {
                final Map<String, Object> dict = dictStack.pop();
                if (!arrayStack.empty())
                    arrayStack.peek().add(dict);
                else
                    mPlistHashMap = dict;
            }
            break;
        case XmlPullParser.END_DOCUMENT:
            done = true;
            break;
        }
        eventType = parser.next();
    }

}

私のplistは、3つの文字列を持つ辞書アイテムの配列で構成されています。これが私のplistXMLファイルのスニペットです:

<array>
    <dict>
        <key>Country</key>
        <string>Mexico</string>
        <key>Name</key>
        <string>Mexico City</string>
        <key>Data</key>
        <string>Line one\nLine two\nLine three</string>
    </dict>
4

2 に答える 2

1

テキストをラップして、実際の改行を使用します。次に、パーサーは、書き込まれたとおりのデータを正確に提供する必要があります。何かのようなもの:

   <array>
        <dict>
            <key>Country</key>
            <string>Mexico</string>
            <key>Name</key>
            <string>Mexico City</string>
            <key>Data</key>
            <string>
<![CDATA[
Line one
Line two
Line three
]]>
            </string>
        </dict>
    </array>
于 2012-07-18T05:47:03.267 に答える
0

Nikolay の提案のおかげで、私のテキストがどういうわけか埋め込まれていて、改行文字に余分なバックスラッシュが含まれていることがわかりました。したがって、私のテキストには「\n」ではなく「\n」がありました。.replaceAll("\n","\n") を使用しようとしましたが、何らかの理由で機能しませんでした。これが私のために働いたコードです:

contactData = dict.get("Data").toString().replace("\\n", "\n");
于 2012-07-19T01:44:03.337 に答える