2012-04-05 137 views
0

我正在编程我的第一个,并承认业余的Android项目。目前我在viewpager类中创建按钮,但是我已经达到了在instantiateItem内部添加代码(任何代码)的地步,导致viewpager失败。即使代码不会做任何事情,例如: int a = 1; 导致崩溃,只要它似乎是关键的行号。整个程序运行良好,然后在instantiateItem中的任何位置添加一行,任何代码,并崩溃。 Android构建目标是4.0,min sdk是14.在模拟器和我的galaxy nexus手机上都会发生崩溃。 viewpager中的代码总长度为1000行,包括注释和空白,删除的行数大约为850行。由于课程长度而导致Android验证程序失败?

确切的错误:

VFY:无效切换目标26( - > 0x9e0)在0x9c6 [1]

VFY:在0x9c6

W¯¯拒绝操作码0x2B访问/ dalvikvm(8886):VFY :被拒绝Lcharacter/sheet/CharacterViewer $ MyPagerAdapter; .instantiateItem(Landroid/view/View; I)Ljava/lang/Object;

W/dalvikvm(8886):验证拒绝类Lcharacter /片/ CharacterViewer $ MyPagerAdapter;

W/dalvikvm(8886):线程ID = 1:螺纹与未捕获的异常(组= 0x40a661f8)离开

E/AndroidRuntime(8886):java.lang.VerifyError的:字符/片/ 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的情况下的区域内。所述按钮中的一个的实施例 :

  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

基于错误“VFY:无效的切换目标”,我不知道这个问题的欺骗:http://stackoverflow.com/questions/6025891/switch-case-statements-causes-fatal- error-in-my-android-app – 2012-04-05 22:01:22

+0

这里只有5种情况,所以可能不是完全相同的问题。该链接确实提到了对视图数量的限制,但没有详细说明,我的googlefu也没有提出任何建议。额外的代码不需要在案件内部以导致崩溃。 – Zolek 2012-04-06 03:28:05

回答

0

我工作围绕这通过移动所有文本视图和按钮的代码了instantiateItem方法,进入自己的方法,然后调用每个案件的方法,而不是直接在内部具有instantiateItem的代码。

0

我相当肯定你的问题是不是由于类长度。我看过旧的J2ME代码8000行,因为它们将代码全部折叠到一个类中(为了节省空间)。现代手机和IDE肯定可以支持更多。发布一些你的代码,也许我们可以提供帮助。

+0

我添加了更多的代码细节,其中包括一个代码块示例,我可以将其粘贴到instantiateItem中的任何位置并导致崩溃 – Zolek 2012-04-06 03:21:10

0

用“常规粒径”码片(即小于10000线)甲DEX VRFY错误消息意味着您在任一击中了一个错误:

  1. 在Dalvik字节码校验器。 Froyo Dalvik字节码验证器中存在一个类似here的错误。你在Froyo上部署/测试?

  2. Java编译器中的一个错误。如果Java编译器产生不正确的Java字节码,那么Dalvik字节码也将不正确。如果您使用Eclipse或javac进行编译,这种情况不太可能发生。

  3. dexer中的错误。 dexer将Java字节码转换成Dalvik字节码。如果在翻译过程中有错误,则发出不正确的Dalvik字节码。

+0

这发生在android 4.0和4.0.3上 - 在决定使用解决方法。 – Zolek 2012-04-07 11:26:49

相关问题