【问题标题】:Parsing local xml android with drawable使用drawable解析本地xml android
【发布时间】:2014-09-20 20:39:29
【问题描述】:

我想从 android 的 assets 文件夹中解析一个本地 XML 文件,我找到了一个不错的教程:http://theopentutorials.com/tutorials/android/xml/android-simple-xmlpullparser-tutorial/

一切都很好,我已经转换了教程代码以获得一个漂亮的列表视图,每个行项目都有一个图像、标题和描述,但是有一个大问题:

如何解析本地 XML 文件中的可绘制图像以加载图像?所有图像都存储在drawable文件夹中。

示例 XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<cities>
    <city>
        <cid>1</cid>
        <name>Passau</name>
        <image>@drawable/passau</image>
        <desc>Lorem ipsum</desc>
    </city>
    <city>
        <cid>2</cid>
        <name>Bamberg</name>
        <image>@drawable/bamberg</image>
        <desc>Lorem ipsum</desc>
    </city>
    <city>
        <cid>3</cid>
        <name>Augsburg</name>
        <image>@drawable/augsburg</image>
        <desc>Lorem ipsum</desc>
    </city>
</cities>

适配器示例:

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

/**
 * Created by Ben on 29.07.2014.
 */
public class ListViewAdapter extends ArrayAdapter<RowItem> {
    Context context;

    public ListViewAdapter(Context context, int resourceId,
                               List<RowItem> items) {
        super(context, resourceId, items);
        this.context = context;
    }

    /*private view holder class*/
    private class ViewHolder {
        ImageView imageView;
        TextView txtTitle;
        TextView txtDesc;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        RowItem rowItem = getItem(position);

        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.row_item, null);
            holder = new ViewHolder();
            holder.txtDesc = (TextView) convertView.findViewById(R.id.Desc);
            holder.txtTitle = (TextView) convertView.findViewById(R.id.Titel);
            holder.imageView = (ImageView) convertView.findViewById(R.id.Bild);
            convertView.setTag(holder);
        } else
            holder = (ViewHolder) convertView.getTag();

        holder.txtDesc.setText(rowItem.getDesc());
        holder.txtTitle.setText(rowItem.getTitle());
        holder.imageView.setImageResource(rowItem.getImageDrawable());

        return convertView;
    }
}

【问题讨论】:

    标签: android xml-parsing drawable


    【解决方案1】:

    将您的资源名称添加到 xml 中并尝试以下操作: How do I get the resource id of an image if I know its name? 要从您从 xml 获得的资源名称中获取资源 id。就是这样。

    根据他的适配器,这里是要更改的行:

    holder.imageView.setImageResource(getContext().getResources().getIdentifier(rowItem.getImage(), "drawable", getContext().getPackageName()));
    

    抬头时:http://developer.android.com/reference/android/widget/ArrayAdapter.html 它获取工作的上下文并提供方法“getContext”,您可以访问 getResources()。

    您的 RowItem 已经包含带有图像名称的字符串。您必须删除 xml 中的“@drawable/”前缀。

    【讨论】:

    • 谢谢。不知道如何实现这一点。我有一个自定义适配器类、一个解析器类和我的数据定义类。我必须在我的定义类中使用 String 作为类型,并在我的适配器类中解析一个整数来保存图像视图,但我必须在哪里设置:getResources().getIdentifier(mDrawableName , "drawable", getPackageName());
    • 在您的适配器中,您可以在其中访问资源的上下文。通过您的适配器,我将提供示例。
    • 谢谢,我已将适配器添加为我的问题的编辑。
    • 抱歉耽搁了,但是当你发布适配器代码时我在超市;)
    • 我改了例子,我的错。 getPackageName() 是上下文的一部分;) 所以你需要 getContext().getPackageName() 或硬编码你在清单中使用的包名。
    【解决方案2】:

    在这里,我将考虑您已经将城市作为集合类。您可以通过收集以下图像标签来做到这一点。

     else if (tagname.equalsIgnoreCase("image")) {
                        city.setImageDrawable(text);
    

    因此,城市对象将具有来自 XML 标记的图像值。在适配器中膨胀视图时,只需从城市对象中获取此值并将其设置为您的图像视图,例如 -

    获取城市对象中设置的图像可绘制值-

    Drawable imageDrawable = city.getImageDrawablwe();
    

    在您的适配器 getView 方法中将图像设置为您的图像视图。

    setBackgroundResource(imageDrawable);
    

    【讨论】:

    • 谢谢,但它并没有真正起作用,因为在 else if 语句中无法处理可绘制数据类型。或者我做错了什么......
    • 我没有运行这段代码。你只需要做这样的事情。只需检查如何从 xml 中获取可绘制元素并在城市对象中设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2012-07-23
    相关资源
    最近更新 更多