java.lang.NoSuchFieldException: FLAG_NEEDS_MENU_KEY

原因解析:

	/**
     * Returns a {@code Field} object that reflects the specified public member
     * field of the class or interface represented by this {@code Class}
     * object. The {@code name} parameter is a {@code String} specifying the
     * simple name of the desired field.
     *
     * 

The field to be reflected is determined by the algorithm that * follows. Let C be the class or interface represented by this object: * *

    *
  1. If C declares a public field with the name specified, that is the * field to be reflected.
  2. *
  3. If no field was found in step 1 above, this algorithm is applied * recursively to each direct superinterface of C. The direct * superinterfaces are searched in the order they were declared.
  4. *
  5. If no field was found in steps 1 and 2 above, and C has a * superclass S, then this algorithm is invoked recursively upon S. * If C has no superclass, then a {@code NoSuchFieldException} * is thrown.
  6. *
* *

If this {@code Class} object represents an array type, then this * method does not find the {@code length} field of the array type. * * @param name the field name * @return the {@code Field} object of this class specified by * {@code name} * @throws NoSuchFieldException if a field with the specified name is * not found. * @throws NullPointerException if {@code name} is {@code null} * @throws SecurityException * If a security manager, s, is present and * the caller's class loader is not the same as or an * ancestor of the class loader for the current class and * invocation of {@link SecurityManager#checkPackageAccess * s.checkPackageAccess()} denies access to the package * of this class. * * @since JDK1.1 * @jls 8.2 Class Members * @jls 8.3 Field Declarations */ // Android-changed: Removed SecurityException public Field getField(String name) throws NoSuchFieldException { if (name == null) { throw new NullPointerException("name == null"); } Field result = getPublicFieldRecursive(name); if (result == null) { throw new NoSuchFieldException(name); } return result; }

在 getField(String name) 的源码中可以看出

如果具有指定名称的字段为未找到就会报NoSuchFieldException。

解决办法,把代码放入 try{}catch(){} 中,抛出 NoSuchFieldException 异常。

解决方案:

		// 设置没有实体菜单键的机器显示虚拟菜单键
        try {
            window.addFlags(WindowManager.LayoutParams.class.getField("FLAG_NEEDS_MENU_KEY").getInt(null));
        } catch (NoSuchFieldException e) {
            // Ignore since this field won't exist in most versions of Android
        } catch (Exception e) {
            e.printStackTrace();
        }

你可能感兴趣的:(Android)