我正在编程我的第一个,并且无可否认是业余的android项目。目前我正在viewpager类中创建按钮,但是我在instantiateItem中添加代码,任何代码,导致viewpager失败。即使是没有做任何事情的代码,例如:
int a = 1;
只要看起来是关键的行号,就会导致崩溃。整个程序运行得很好,然后我在instantiateItem中的任何地方添加一行,任何代码,然后崩溃。 Android构建目标是4.0,最小sdk是14.模拟器和我的galaxy nexus手机都会发生崩溃。 viewpager中的代码总长度为1000行,包括注释和空格,删除它们的行数约为850行。
确切错误:
VFY:无效的开关目标26( - > 0x9e0)位于0x9c6 [1]
VFY:拒绝0x9c6
处的操作码0x2bW / dalvikvm(8886):VFY:拒绝Lcharacter / sheet / CharacterViewer $ MyPagerAdapter; .instantiateItem(Landroid / view / View; I)Ljava / lang / Object;
W / dalvikvm(8886):Verifier拒绝了类Lcharacter / sheet / CharacterViewer $ MyPagerAdapter;
W / dalvikvm(8886):threadid = 1:线程退出,未捕获异常(group = 0x40a661f8)
E / AndroidRuntime(8886):java.lang.VerifyError:character / sheet / CharacterViewer $ MyPagerAdapter
字符查看器活动的代码:
public class CharacterViewer extends Activity {
final DBAdapter db = new DBAdapter(this);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pager);
Intent startCharacterViewer = getIntent();
final int activePagerPage = startCharacterViewer.getIntExtra("activePagerPage", 0);
MyPagerAdapter adapter = new MyPagerAdapter();
ViewPager myPager = (ViewPager) findViewById(R.id.myfivepanelpager);
myPager.setAdapter(adapter);
myPager.setCurrentItem(activePagerPage); }
private class MyPagerAdapter extends PagerAdapter {
Intent startCharacterViewer = getIntent();
final int activeCharacter = startCharacterViewer.getIntExtra("activeCharacter", 0);
public int getCount() {
return 5;
}
public Object instantiateItem(View collection, int position) {
db.open();
LayoutInflater inflater = (LayoutInflater) collection.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
String name = db.getAttribute(activeCharacter, 1);
int level = Integer.valueOf(db.getAttribute(activeCharacter, 2));
//repeats for many variables (106 total)
db.close();
View v = null;
switch (position) {
//case 0
case 0:
v = inflater.inflate(R.layout.details, null);
break;
//case 1
case 1:
v = inflater.inflate(R.layout.features, null);
break;
//case 2
case 2:
v = inflater.inflate(R.layout.summary, null);
TextView text1 = (TextView) v.findViewById(R.id.textViewName);
text1.setText (name + " level " + level + " " + characterClass);
//repeats many times for more text views
//many many buttons and text views defined here
//case 3
case 3:
v = inflater.inflate(R.layout.skills, null);
//more text views and buttons defined here
case 4:
v = inflater.inflate(R.layout.inventory, null);
break;
}
((ViewPager) collection).addView(v, 0);
return v;
}
按钮和文本视图集代码嵌套在instantiateItem的case区域内。 其中一个按钮的示例:
TextView hpUpdaterText1 = (TextView) v.findViewById(R.id.textViewHP);
TextView hpUpdaterText2 = (TextView) v.findViewById(R.id.textViewSurges);
final int a1 = hpMax;
final int b1 = hpSurgeMax;
View.OnClickListener hpModifierListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
final Dialog myDialog = new Dialog(CharacterViewer.this);
myDialog.setContentView(R.layout.edithitpoints);
myDialog.setTitle("Modify Permanent Health Values");
myDialog.setCancelable(true);
myDialog.show();
EditText text1 = (EditText) myDialog.findViewById(R.id.editTextHPMax);
text1.setText ("" + (a1));
EditText text2 = (EditText) myDialog.findViewById(R.id.editTextSurges);
text2.setText ("" + (b1));
//Cancel button
Button button1 = (Button) myDialog.findViewById(R.id.editHitPointsCancel);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
myDialog.dismiss();
}});
//OK button
Button button2 = (Button) myDialog.findViewById(R.id.editHitPointsOK);
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
EditText text1 = (EditText) myDialog.findViewById(R.id.editTextHPMax);
String a = text1.getText().toString();
if( a.length() == 0 ) {text1.setError( "Value Required" );}
EditText text2 = (EditText) myDialog.findViewById(R.id.editTextSurges);
String b = text2.getText().toString();
if( b.length() == 0 ) {text2.setError( "Value Required" );}
if (a.length() != 0 && b.length() != 0){
db.open();
db.updatePermanentHP(activeCharacter, a, b);
db.close();
//restart activity to update variables
Intent startCharacterViewer = new Intent("android.intent.action.SUMMARY");
startCharacterViewer.putExtra("activeCharacter", activeCharacter);
finish();
startCharacterViewer.putExtra("activePagerPage", 2);
startActivity(startCharacterViewer);
myDialog.dismiss();}
else {Toast msg = Toast.makeText(CharacterViewer.this,
"Please enter a value for" + "\n" + "all available fields", Toast.LENGTH_SHORT);
msg.show();;}
}});
}};
hpUpdaterText1.setOnClickListener(hpModifierListener);
hpUpdaterText2.setOnClickListener(hpModifierListener);
在instantiateItem内部添加任何代码行都会导致错误。例如,我可以在instantiateItem中的任何位置剪切并粘贴此代码块,这会导致程序崩溃。这些变量名称不用于任何内容。
示例问题代码块:
int uuu = 1;
int aaa = 2;
int bbb = 3;
int ccc = 4;
int ddd = 5;
int eee = 6;
答案 0 :(得分:0)
我很确定你的问题不是因为课堂长度。我已经看到旧的J2ME代码8000行很长,因为它们将代码全部折叠到一个类中(出于节省空间的原因)。现代手机和IDE绝对可以支持更多功能。发布一些代码,也许我们可以提供帮助。
答案 1 :(得分:0)
我通过将所有文本视图和按钮代码从instantiateItem方法移出到自己的方法中,然后为每个案例调用这些方法而不是直接在instantiateItem中包含代码来解决这个问题。
答案 2 :(得分:0)
带有“正常大小”代码段(即小于10000行)的dex VRFY错误消息表示您遇到了以下任何一个错误:
Dalvik字节码验证器。 Froyo Dalvik字节码验证器中有一个类似于here的错误。你在Froyo上部署/测试吗?
Java编译器中的错误。如果Java编译器产生不正确的Java字节码,那么Dalvik字节码也将是不正确的。如果您使用Eclipse或javac进行编译,则不太可能。
dexer中的一个错误。 dexer将Java字节码转换为Dalvik字节码。如果在翻译过程中存在错误,则会发出错误的Dalvik字节码。