Android - 解析损坏的XML示例

4
自API v.11发布以来,Android SDK中包含了XmlAdapter示例,官方网站也有相关引用。该示例现在至少出现在3个文件夹中:android-11、android-12和android-13。但是,它已经损坏了。主要(但不仅)问题在于它声明了找不到的android.content.XmlDocumentProvider提供程序,包括https://android.googlesource.com上也没有找到。
此外,在Adapters.java中还存在编译问题:
mContext cannot be resolved to a variable   line 973
mFrom cannot be resolved to a variable  line 938
mTo cannot be resolved to a variable    line 937
mTo cannot be resolved to a variable    line 939

android-developers上有几个与此相关的问题,但没有答案。是否有人成功追踪到这个难以捉摸的XmlDocumentProvider并使示例工作?最重要的是,亲爱的Android团队,您能修复示例或撤下它吗?


我在http://code.google.com/p/android/issues/detail?id=19473填写了一个错误报告。 - Bostone
4个回答

2
缺失的 XmlDocumentProvider 现在随着 SDK 14 的示例一起发布,该项目可以编译针对 SDK 8 及以上版本。但是,要成功运行它,您必须修改清单以指向正确的提供程序:
<provider android:name="com.example.android.xmladapters.XmlDocumentProvider"
       android:authorities="xmldocument" />

1
除了像 Jeff Gilfelt 指出的那样修复 AndroidManifest.xml 之外,您还可以按照以下方式更改 Adapters.java 中的 XmlCursorAdapter 类代码(显示错误的文件):
/**
 * Implementation of a Cursor adapter defined in XML. This class is a thin wrapper
 * of a SimpleCursorAdapter. The main difference is the ability to handle CursorBinders.
 */
private static class XmlCursorAdapter extends SimpleCursorAdapter implements ManagedAdapter {
    private Context mContext;
    private String mUri;
    private final String mSelection;
    private final String[] mSelectionArgs;
    private final String mSortOrder;
    private final int[] mTo;
    private final String[] mFrom;
    private final String[] mColumns;
    private final CursorBinder[] mBinders;
    private AsyncTask<Void,Void,Cursor> mLoadTask;



    XmlCursorAdapter(Context context, int layout, String uri, String[] from, int[] to,
            String selection, String[] selectionArgs, String sortOrder,
            HashMap<String, CursorBinder> binders) {

        super(context, layout, null, from, to);
        mContext = context;
        mUri = uri;
        mFrom = from;
        mTo = to;
        mSelection = selection;
        mSelectionArgs = selectionArgs;
        mSortOrder = sortOrder;
        mColumns = new String[from.length + 1];
        // This is mandatory in CursorAdapter
        mColumns[0] = "_id";
        System.arraycopy(from, 0, mColumns, 1, from.length);

        CursorBinder basic = new StringBinder(context, new IdentityTransformation(context));
        final int count = from.length;
        mBinders = new CursorBinder[count];

        for (int i = 0; i < count; i++) {
            CursorBinder binder = binders.get(from[i]);
            if (binder == null) binder = basic;
            mBinders[i] = binder;
        }
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        final int count = mTo.length;
        final int[] to = mTo;
        final CursorBinder[] binders = mBinders;

        for (int i = 0; i < count; i++) {
            final View v = view.findViewById(to[i]);
            if (v != null) {
                binders[i].bind(v, cursor, cursor.getColumnIndex(mFrom[i]));
            }
        }
    }
    ......
    ......
    ......

我从这里找到的代码得到了答案:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/4.0.1_r1/com/example/android/xmladapters/Adapters.java?av=f


0

我遇到了同样的错误并进行了搜索,发现这个问题已经被问了很多次。这是我如何解决它的方法。

我找到了一个名为XmlDocumentProvider的类(链接)

我将XmlDocumentProvider.java复制到XmlAdapter项目中,并通过替换AndroidManifest.xml来进行修改:

<provider android:name="android.content.XmlDocumentProvider"
       android:authorities="xmldocument" /> 

使用:

<provider android:name="com.example.android.xmladapters.XmlDocumentProvider"
   android:authorities="xmldocument" />

现在我已经成功让RssReaderActivity运行起来了。


0
我从Romain Guy那里得到了答案,或者说是有点。我昨天打开的工单现在有一个标签状态:未来发布,我想这意味着他们将在下一个版本中修复它。为了增加参考,这是关于android-developers讨论的链接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接