下面列出了怎么用android.content.res.XmlResourceParser的API类实例代码及写法,或者点击链接到github查看源代码。
@NonNull
private WearPreferenceScreen parseScreen(@NonNull final Context context, @NonNull final XmlResourceParser parser)
throws XmlPullParserException, IOException {
while(parser.getName() == null) {
parser.next();
}
if("PreferenceScreen".equals(parser.getName())) {
final WearPreferenceScreen screen = new WearPreferenceScreen(context, parser);
parsePreferences(context, parser, screen);
return screen;
} else {
throw new IllegalArgumentException("Preferences file must start with a PreferenceScreen element");
}
}
@Override
public long parseAndAdd(XmlResourceParser parser) throws XmlPullParserException,
IOException {
// Folder contents come from an external XML resource
final Partner partner = Partner.get(mPackageManager);
if (partner != null) {
final Resources partnerRes = partner.getResources();
final int resId = partnerRes.getIdentifier(Partner.RES_FOLDER,
"xml", partner.getPackageName());
if (resId != 0) {
final XmlResourceParser partnerParser = partnerRes.getXml(resId);
beginDocument(partnerParser, TAG_FOLDER);
FolderParser folderParser = new FolderParser(getFolderElementsMap(partnerRes));
return folderParser.parseAndAdd(partnerParser);
}
}
return -1;
}
private void parseKeyboardLayoutSet(final Resources res, final int resId)
throws XmlPullParserException, IOException {
final XmlResourceParser parser = res.getXml(resId);
try {
while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
final int event = parser.next();
if (event == XmlPullParser.START_TAG) {
final String tag = parser.getName();
if (TAG_KEYBOARD_SET.equals(tag)) {
parseKeyboardLayoutSetContent(parser);
} else {
throw new XmlParseUtils.IllegalStartTag(parser, tag, TAG_KEYBOARD_SET);
}
}
}
} finally {
parser.close();
}
}
private void getAttributes(StringBuilder sb, XmlResourceParser parser) throws XmlPullParserException {
int count = parser.getAttributeCount();
for (int i = 0; i < count; i++) {
sb.append(" ");
String namespace = parser.getAttributeNamespace(i);
if (namespace != null) {
int index = namespace.lastIndexOf("/");
if (index > 0) {
namespace = namespace.substring(index + 1);
}
sb.append(namespace);
sb.append(":");
}
sb.append(parser.getAttributeName(i));
sb.append("=");
sb.append(parser.getAttributeValue(i));
}
}
@Override
public long parseAndAdd(XmlResourceParser parser) throws XmlPullParserException,
IOException {
// Folder contents come from an external XML resource
final Partner partner = Partner.get(mPackageManager);
if (partner != null) {
final Resources partnerRes = partner.getResources();
final int resId = partnerRes.getIdentifier(Partner.RES_FOLDER,
"xml", partner.getPackageName());
if (resId != 0) {
final XmlResourceParser partnerParser = partnerRes.getXml(resId);
beginDocument(partnerParser, TAG_FOLDER);
FolderParser folderParser = new FolderParser(getFolderElementsMap(partnerRes));
return folderParser.parseAndAdd(partnerParser);
}
}
return -1;
}
public Row(Resources res, @NonNull final Keyboard parent, XmlResourceParser parser) {
if (DEBUG) Log.v(TAG, "コンストラクタ:");
this.parent = parent;
TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser),
R.styleable.Keyboard);
defaultWidth = getDimensionOrFraction(a,
R.styleable.Keyboard_keyWidth,
parent.mDisplayWidth, parent.mDefaultWidth);
defaultHeight = getDimensionOrFraction(a,
R.styleable.Keyboard_keyHeight,
parent.mDisplayHeight, parent.mDefaultHeight);
defaultHorizontalGap = getDimensionOrFraction(a,
R.styleable.Keyboard_horizontalGap,
parent.mDisplayWidth, parent.mDefaultHorizontalGap);
verticalGap = getDimensionOrFraction(a,
R.styleable.Keyboard_verticalGap,
parent.mDisplayHeight, parent.mDefaultVerticalGap);
a.recycle();
a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.Keyboard_Row);
rowEdgeFlags = a.getInt(R.styleable.Keyboard_Row_rowEdgeFlags, 0);
mode = a.getResourceId(R.styleable.Keyboard_Row_keyboardMode, 0);
a.recycle();
}
@Override
protected Key createKeyFromXml(Resources res, Row parent, int x, int y,
XmlResourceParser parser) {
Key key = new LatinKey(res, parent, x, y, parser);
if (key.codes == null) return key;
switch (key.codes[0]) {
case LatinIME.ASCII_ENTER:
mEnterKey = key;
break;
case LatinKeyboardView.KEYCODE_F1:
mF1Key = key;
break;
case LatinIME.ASCII_SPACE:
mSpaceKey = key;
break;
case KEYCODE_MODE_CHANGE:
m123Key = key;
m123Label = key.label;
break;
}
return key;
}
private CertificatesEntryRef parseCertificatesEntry(XmlResourceParser parser,
boolean defaultOverridePins)
throws IOException, XmlPullParserException, ParserException {
boolean overridePins =
parser.getAttributeBooleanValue(null, "overridePins", defaultOverridePins);
int sourceId = parser.getAttributeResourceValue(null, "src", -1);
String sourceString = parser.getAttributeValue(null, "src");
CertificateSource source = null;
if (sourceString == null) {
throw new ParserException(parser, "certificates element missing src attribute");
}
if (sourceId != -1) {
// TODO: Cache ResourceCertificateSources by sourceId
source = new ResourceCertificateSource(sourceId, mContext);
} else if ("system".equals(sourceString) || "user".equals(sourceString)) {
// MLM treat user as system
source = SystemCertificateSource.getInstance();
// } else if ("user".equals(sourceString)) {
// source = UserCertificateSource.getInstance();
} else {
throw new ParserException(parser, "Unknown certificates src. "
+ "Should be one of system|user|@resourceVal");
}
XmlUtils.skipCurrentTag(parser);
return new CertificatesEntryRef(source, overridePins);
}
public List<String[]> parse(XmlResourceParser parser) throws IOException, XmlPullParserException {
ArrayList<String[]> data = new ArrayList<>();
while (eventType != XmlResourceParser.END_DOCUMENT) {
if (eventType == XmlResourceParser.START_TAG) {
String defaultValue = parser.getAttributeValue(NAMESPACE, DEFAULT_VALUE);
String key = parser.getAttributeValue(NAMESPACE, KEY);
if (defaultValue != null) {
String[] keyValue = new String[2];
keyValue[0] = key;
keyValue[1] = defaultValue;
data.add(keyValue);
}
}
eventType = parser.next();
}
return data;
}
public void inflateMenu(@MenuRes int menuRes) {
if(menuRes == 0) return;
if (isInEditMode()) return;
getActivity().getMenuInflater().inflate(menuRes, mActionMenu.getMenu());
XmlResourceParser parser = null;
try {
//noinspection ResourceType
parser = getResources().getLayout(menuRes);
AttributeSet attrs = Xml.asAttributeSet(parser);
parseMenu(parser, attrs);
} catch (XmlPullParserException | IOException e) {
// should not happens
throw new InflateException("Error parsing menu XML", e);
} finally {
if (parser != null) parser.close();
}
}
@Override
public long parseAndAdd(XmlResourceParser parser) {
final String packageName = getAttributeValue(parser, ATTR_PACKAGE_NAME);
final String className = getAttributeValue(parser, ATTR_CLASS_NAME);
if (TextUtils.isEmpty(packageName) || TextUtils.isEmpty(className)) {
if (LOGD) Log.d(TAG, "Skipping invalid <favorite> with no component");
return -1;
}
mValues.put(Favorites.RESTORED, ShortcutInfo.FLAG_AUTOINTALL_ICON);
final Intent intent = new Intent(Intent.ACTION_MAIN, null)
.addCategory(Intent.CATEGORY_LAUNCHER)
.setComponent(new ComponentName(packageName, className))
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
return addShortcut(mContext.getString(R.string.package_state_unknown), intent,
Favorites.ITEM_TYPE_APPLICATION);
}
@Override
protected Key createKeyFromXml(Resources res, Row parent, int x, int y, XmlResourceParser parser) {
Key key = new LatinKey(res, parent, x, y, parser);
if (key.codes[0] == 13) {
mEnterKey = key;
} else if (key.codes[0] == TerminalKeyboard.CTRL_KEY) {
mCtrlKey = key;
} else if (key.codes[0] == TerminalKeyboard.ALT_KEY) {
mALTKey = key;
} else if (key.codes[0] == -1) {
mShiftKeyLeft = key;
} else if (key.codes[0] == -999) {
mShiftKeyRight = key;
} else if (key.codes[0] == -2) {
mFNKey = key;
}
return key;
}
static int readScriptId(final Resources resources, final InputMethodSubtype subtype) {
final String layoutSetName = KEYBOARD_LAYOUT_SET_RESOURCE_PREFIX
+ SubtypeLocaleUtils.getKeyboardLayoutSetName(subtype);
final int xmlId = getXmlId(resources, layoutSetName);
final XmlResourceParser parser = resources.getXml(xmlId);
try {
while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
// Bovinate through the XML stupidly searching for TAG_FEATURE, and read
// the script Id from it.
parser.next();
final String tag = parser.getName();
if (TAG_FEATURE.equals(tag)) {
return readScriptIdFromTagFeature(resources, parser);
}
}
} catch (final IOException | XmlPullParserException e) {
throw new RuntimeException(e.getMessage() + " in " + layoutSetName, e);
} finally {
parser.close();
}
// If the tag is not found, then the default script is Latin.
return ScriptUtils.SCRIPT_LATIN;
}
@NonNull
private WearPreference parsePreferenceInternal(@NonNull final Context context, @NonNull final String name, @NonNull final XmlResourceParser parser) {
switch(parser.getName()) {
case "ListPreference":
return new WearListPreference(context, parser);
case "SwitchPreference":
case "CheckBoxPreference":
return new WearTwoStatePreference(context, parser);
default:
return parsePreferenceUsingReflection(context, name, parser);
}
}
/**
* 读取XML配置文件
* @param id 配置文件索引
*/
private void readXML(int id){
String name;
String className = getClass().getSimpleName();
XmlResourceParser xrp = getResources().getXml(id);
try {
while(xrp.getEventType() != XmlResourceParser.END_DOCUMENT){
if (xrp.getEventType() == XmlResourceParser.START_TAG) {
name = xrp.getName();
if (name.equals("BackgroundColor")) {
mNavigationView.setBackgroundColor(xrp.getAttributeIntValue(0, mNavigationView.getBackgroundColor()));
}
if (name.equals("StatusType")) {
mNavigationView.setStatusType(xrp.getAttributeIntValue(0, mNavigationView.getStatusType()));
}
if (name.equals("TitleColor")) {
mNavigationView.setTitleColor(xrp.getAttributeIntValue(0, mNavigationView.getTitleColor()));
}
if (name.equals("LineBackgroundColor")) {
mNavigationView.setLineBackgroundColor(xrp.getAttributeIntValue(0, mNavigationView.getTitleColor()));
}
if (name.equals("NavigationTextColor")) {
mNavigationView.setNavigationTextColor(xrp.getAttributeIntValue(0, mNavigationView.getNavigationTextColor()));
}
if (name.equals("Title") && xrp.getAttributeValue(0).equals(className)) {
mNavigationView.setTitle(xrp.getAttributeValue(1));
}
}
xrp.next();
}
} catch (Exception e) {
Log.d(UE.TAG, "UEConfig配置出错"+e.toString());
}
}
private static void skipCurrentTag(XmlResourceParser parser)
throws XmlPullParserException, IOException {
int outerDepth = parser.getDepth();
int type;
while ((type=parser.next()) != XmlResourceParser.END_DOCUMENT
&& (type != XmlResourceParser.END_TAG
|| parser.getDepth() > outerDepth)) {
}
}
private String getStringAttributeValue(XmlResourceParser xmlParser, String attributeName,
String defaultValue) {
String value = xmlParser.getAttributeValue(null, attributeName);
if (value != null)
return value;
return defaultValue;
}
protected Key createKeyFromXml(@NonNull final Resources res,
@NonNull final Row parent,
final int x, final int y,
@NonNull final XmlResourceParser parser) {
if (DEBUG) Log.v(TAG, "createKeyFromXml:");
return new Key(res, parent, x, y, parser);
}
private static PathStrategy parsePathStrategy(Context context, String authority) throws IOException, XmlPullParserException {
SimplePathStrategy strat = new SimplePathStrategy(authority);
XmlResourceParser in = context.getPackageManager().resolveContentProvider(authority, 128).loadXmlMetaData(context.getPackageManager(), META_DATA_FILE_PROVIDER_PATHS);
if (in == null) {
throw new IllegalArgumentException("Missing android.support.FILE_PROVIDER_PATHS meta-data");
}
while (true) {
int type = in.next();
if (type == 1) {
return strat;
}
if (type == 2) {
String tag = in.getName();
String name = in.getAttributeValue(null, "name");
String path = in.getAttributeValue(null, ATTR_PATH);
File target = null;
if (TAG_ROOT_PATH.equals(tag)) {
target = buildPath(DEVICE_ROOT, path);
} else if (TAG_FILES_PATH.equals(tag)) {
target = buildPath(context.getFilesDir(), path);
} else if (TAG_CACHE_PATH.equals(tag)) {
target = buildPath(context.getCacheDir(), path);
} else if (TAG_EXTERNAL.equals(tag)) {
target = buildPath(Environment.getExternalStorageDirectory(), path);
}
if (target != null) {
strat.addRoot(name, target);
}
}
}
}
/**
* Return attribute resource value, attempting launcher-specific namespace
* first before falling back to anonymous attribute.
*/
protected static int getAttributeResourceValue(XmlResourceParser parser, String attribute,
int defaultValue) {
int value = parser.getAttributeResourceValue(
"http://schemas.android.com/apk/res-auto/com.android.launcher3", attribute,
defaultValue);
if (value == defaultValue) {
value = parser.getAttributeResourceValue(null, attribute, defaultValue);
}
return value;
}
/**
* Return attribute value, attempting launcher-specific namespace first
* before falling back to anonymous attribute.
*/
protected static String getAttributeValue(XmlResourceParser parser, String attribute) {
String value = parser.getAttributeValue(
"http://schemas.android.com/apk/res-auto/com.android.launcher3", attribute);
if (value == null) {
value = parser.getAttributeValue(null, attribute);
}
return value;
}
@ColorInt
private int getColorValue(@NonNull XmlResourceParser parser, @IntRange(from = 0) int attrIndex) {
int colorResource = parser.getAttributeResourceValue(attrIndex, 0);
if (colorResource == RESOURCE_NOT_FOUND) {
try {
String colorValue = parser.getAttributeValue(attrIndex);
return Color.parseColor(colorValue);
} catch (Exception ignored) {
return COLOR_NOT_SET;
}
}
return ContextCompat.getColor(context, colorResource);
}
private String ParseReleaseTag(XmlResourceParser aXml) throws XmlPullParserException, IOException {
String _Result = "<h1>版本: " + aXml.getAttributeValue(null, "version") + "</h1><ul>";
int eventType = aXml.getEventType();
while ((eventType != XmlPullParser.END_TAG) || (aXml.getName().equals("change"))) {
if ((eventType == XmlPullParser.START_TAG) && (aXml.getName().equals("change"))) {
eventType = aXml.next();
_Result = _Result + "<li>" + aXml.getText() + "</li>";
}
eventType = aXml.next();
}
_Result = _Result + "</ul>";
return _Result;
}
public T inflate(Context context, int xmlId) {
XmlResourceParser parser = context.getResources().getXml(xmlId);
if (parser == null) {
throw new InflateException(String.valueOf(xmlId));
}
try {
int type;
do {
type = parser.next();
} while (type != XmlPullParser.START_TAG && type != XmlPullParser.END_DOCUMENT);
if (type != XmlPullParser.START_TAG) {
throw new InflateException(parser.getPositionDescription());
}
T result = notNull(createFromTag(context, parser, null, parser));
if (mCompositeClazz.isInstance(result)) {
inflateRec(context, parser, mCompositeClazz.cast(result), parser);
}
return result;
} catch (XmlPullParserException | IOException ex) {
throw new InflateException(parser.getPositionDescription(), ex);
}
}
private XmlResourceParser getSkinXml(Context context, int resId) {
if (!isDefaultSkin) {
int targetResId = getTargetResId(context, resId);
if (targetResId != 0) {
return mResources.getXml(targetResId);
}
}
return context.getResources().getXml(resId);
}
@Override
protected void parseContainerAndScreen(XmlResourceParser parser, long[] out) {
out[0] = LauncherSettings.Favorites.CONTAINER_DESKTOP;
String strContainer = getAttributeValue(parser, ATTR_CONTAINER);
if (strContainer != null) {
out[0] = Long.valueOf(strContainer);
}
out[1] = Long.parseLong(getAttributeValue(parser, ATTR_SCREEN));
}
/**
* Gets search information for the given activity.
*
* @param context Context to use for reading activity resources.
* @param activityInfo Activity to get search information from.
* @return Search information about the given activity, or {@code null} if
* the activity has no or invalid searchability meta-data.
*
* @hide For use by SearchManagerService.
*/
public static SearchableInfo getActivityMetaData(Context context, ActivityInfo activityInfo,
int userId) {
Context userContext = null;
try {
userContext = context.createPackageContextAsUser("system", 0,
new UserHandle(userId));
} catch (NameNotFoundException nnfe) {
Log.e(LOG_TAG, "Couldn't create package context for user " + userId);
return null;
}
// for each component, try to find metadata
XmlResourceParser xml =
activityInfo.loadXmlMetaData(userContext.getPackageManager(), MD_LABEL_SEARCHABLE);
if (xml == null) {
return null;
}
ComponentName cName = new ComponentName(activityInfo.packageName, activityInfo.name);
SearchableInfo searchable = getActivityMetaData(userContext, xml, cName);
xml.close();
if (DBG) {
if (searchable != null) {
Log.d(LOG_TAG, "Checked " + activityInfo.name
+ ",label=" + searchable.getLabelId()
+ ",icon=" + searchable.getIconId()
+ ",suggestAuthority=" + searchable.getSuggestAuthority()
+ ",target=" + searchable.getSearchActivity().getClassName()
+ ",global=" + searchable.shouldIncludeInGlobalSearch()
+ ",settingsDescription=" + searchable.getSettingsDescriptionId()
+ ",threshold=" + searchable.getSuggestThreshold());
} else {
Log.d(LOG_TAG, "Checked " + activityInfo.name + ", no searchable meta-data");
}
}
return searchable;
}
private Map<String, ArrayList<CallerInfo>> readValidCertificates(XmlResourceParser parser) {
HashMap<String, ArrayList<CallerInfo>> validCertificates = new HashMap<>();
try {
int eventType = parser.next();
while (eventType != XmlResourceParser.END_DOCUMENT) {
if (eventType == XmlResourceParser.START_TAG
&& parser.getName().equals("signing_certificate")) {
String name = parser.getAttributeValue(null, "name");
String packageName = parser.getAttributeValue(null, "package");
boolean isRelease = parser.getAttributeBooleanValue(null, "release", false);
String certificate = parser.nextText().replaceAll("\\s|\\n", "");
CallerInfo info = new CallerInfo(name, packageName, isRelease);
ArrayList<CallerInfo> infos = validCertificates.get(certificate);
if (infos == null) {
infos = new ArrayList<>();
validCertificates.put(certificate, infos);
}
Timber.v("Adding allowed caller: %s package=%s release=%b certificate=%s",
info.name, info.packageName, info.release, certificate);
infos.add(info);
}
eventType = parser.next();
}
} catch (XmlPullParserException | IOException e) {
Timber.e(e, "Could not read allowed callers from XML.");
}
return validCertificates;
}
@Override
public long parseAndAdd(XmlResourceParser parser)
throws XmlPullParserException, IOException {
final String packageName = getAttributeValue(parser, ATTR_PACKAGE_NAME);
final String className = getAttributeValue(parser, ATTR_CLASS_NAME);
if (TextUtils.isEmpty(packageName) || TextUtils.isEmpty(className)) {
return -1;
}
mValues.put(Favorites.SPANX, getAttributeValue(parser, ATTR_SPAN_X));
mValues.put(Favorites.SPANY, getAttributeValue(parser, ATTR_SPAN_Y));
mValues.put(Favorites.ITEM_TYPE, Favorites.ITEM_TYPE_APPWIDGET);
// Read the extras
Bundle extras = new Bundle();
int widgetDepth = parser.getDepth();
int type;
while ((type = parser.next()) != XmlPullParser.END_TAG ||
parser.getDepth() > widgetDepth) {
if (type != XmlPullParser.START_TAG) {
continue;
}
if (TAG_EXTRA.equals(parser.getName())) {
String key = getAttributeValue(parser, ATTR_KEY);
String value = getAttributeValue(parser, ATTR_VALUE);
if (key != null && value != null) {
extras.putString(key, value);
} else {
throw new RuntimeException("Widget extras must have a key and value");
}
} else {
throw new RuntimeException("Widgets can contain only extras");
}
}
return verifyAndInsert(new ComponentName(packageName, className), extras);
}
/**
* 指定されたパッケージ名からサービスのコンポーネント情報を取得します.
*
* @param context コンテキスト
* @param packageName パッケージ名
* @return コンポーネント情報
*/
private static ServiceInfo getServiceInfo(final Context context, final String packageName) {
try {
PackageManager pkgMgr = context.getPackageManager();
PackageInfo pkg = pkgMgr.getPackageInfo(packageName, PackageManager.GET_SERVICES);
if (pkg != null) {
ServiceInfo[] services = pkg.services;
if (services != null) {
for (int i = 0; i < services.length; i++) {
String pkgName = services[i].packageName;
String className = services[i].name;
ComponentName component = new ComponentName(pkgName, className);
ServiceInfo serviceInfo = pkgMgr.getServiceInfo(component, PackageManager.GET_META_DATA);
if (serviceInfo.metaData != null) {
Object xmlData = serviceInfo.metaData.get(PLUGIN_META_DATA);
if (xmlData instanceof Integer) {
XmlResourceParser xrp = serviceInfo.loadXmlMetaData(pkgMgr, PLUGIN_META_DATA);
if (xrp != null) {
return serviceInfo;
}
}
}
}
}
}
return null;
} catch (NameNotFoundException e) {
return null;
}
}