执行以下代码时,我使用Android的调试器有一种奇怪的行为。变量 value 在窗口小部件初始化后立即消失。我把它移到了手表上,但它说"Cannot find local variable value"
。无论我在何处放置变量,在for循环之前或内部,无论如何都行为相同。我也打印了变量,你可以在代码中看到"value is null"
但是当我通过if (value == null)
检查它时它不会停止并最终在尝试将其转换为整数时抛出错误。 / p>
代码:
for (int i=0; i < (view != null ? ((ViewGroup)view).getChildCount() : 0); i++)
{
// Get name of the widget for example field__id,
// Convert to field name replacing field__id for id
// or for example field_name to name
// Check if the field exists in the column name, if so, add the ContentValue
View widget = ((ViewGroup)view).getChildAt(i);
String widgetName = view.getResources().getResourceEntryName(widget.getId());
String fieldName = widgetName.replace(Model.fieldPrefix,"");
Object value = null;
if (columnNames.contains(fieldName)) {
// TableField on the table matches the field on the form
try {
if (widget instanceof TextView) {
value = ((TextView) widget).getText().toString();
} else if (widget instanceof Spinner) {
value = ((SpinnerRow) ((Spinner) widget).getSelectedItem()).getId();
} else if (widget instanceof DatePicker) {
String date = AppDatabase.formatDateTime( getContext(), ((DatePicker) widget).getYear() + "-" + ((DatePicker) widget).getMonth() + "-" + ((DatePicker) widget).getDayOfMonth());
contentValues.put(fieldName, date ) ;
} else {
throw new ClassCastException("Could not cast the widget"+widget.getClass().toString());
}
Log.d(AppController.DEBUG_TAG, "Widget "+widgetName+" value is " + value.toString());
} catch (NullPointerException e) {
// Ignore exception:
value = null;
}
TableField tableField = this.getTable().getFieldByName(fieldName);
if ( (tableField.isPrimaryKey() && (value.equals("-1") || value.equals("")))
|| !tableField.getNotNull() && value.toString().length()==0 )
value = null;
if ( value == null || tableField.getType() == SQLiteCursor.FIELD_TYPE_NULL ) {
contentValues.putNull(fieldName);
} else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_STRING || tableField.getType() == SQLiteCursor.FIELD_TYPE_VARCHAR) {
contentValues.put(fieldName, String.valueOf(value));
} else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_INTEGER) {
contentValues.put(fieldName, Integer.valueOf(value.toString()) );
} else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_FLOAT) {
contentValues.put(fieldName,Float.valueOf(value.toString()));
} else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_BLOB) {
contentValues.put(fieldName,String.valueOf(value));
}
}
}
答案 0 :(得分:13)
你是否使用带有混淆的proguard?
如果是,那可能是问题 - 用
禁用它-dontobfuscate
你应该用proguard规则放入你的文件(通常是proguard-rules.txt,检查build.gradle文件中的proguard配置,如下例所示:
buildTypes {
debug {
runProguard true
zipAlign true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
signingConfig signingConfigs.debug
testCoverageEnabled true
}
}
答案 1 :(得分:8)
我遇到了同样的问题。最后,通过删除&#39; testCoverageEnabled true&#39;来自gradle构建文件。
答案 2 :(得分:6)
由gradle version 1.0.0
中的错误导致的类似问题已在以后version 1.0.1
在您的项目中搜索'com.android.tools.build:gradle:1.0.0'
文件中的build.gradle
。如果包含模块,则可能有多个build.gradle
文件。
只要你有:
'com.android.tools.build:gradle:1.0.0'
将其更改为:
'com.android.tools.build:gradle:1.0.1'
然后同步gradle。 Android Studio将下载新的gradle jar文件并使用它进行编译。
答案 3 :(得分:2)
如果您的构建使用jack toolchain,则可能是问题的根源。就我而言,禁用插孔解决了这个问题:
buildTypes {
...
debug {
jackOptions {
enabled false
}
}
}
注意:1.8源兼容性需要插孔!
答案 4 :(得分:0)
这对我有用。 与Proguard一起使用时,Android studio无法显示本地变量数据。
需要在调试期间使用以下设置:
1
在proguard-rules.pro文件下添加-donotobfuscate属性, -dontobfuscate OR
2
在build.grade中的debug buildtypes下, minifyEnabled false shrinkResources false
更推荐后期选项,因为你需要压缩你的生产apk。
buildTypes {
debug {
applicationIdSuffix '.debug'
versionNameSuffix '-DEBUG'
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
答案 5 :(得分:0)
有类似的问题。这是Android Studio中使用的Kotlin与应用级build.gradle
文件中声明的Kotlin版本不匹配(可能是在Android Studio更新之后)。颠覆build.gradle
中的版本很有帮助。
答案 6 :(得分:-1)
嗯...就我而言,我只是重建项目来修复它!