2012-04-05 145 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

相關問題