我正在編程我的第一個,並承認業餘的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;
基於錯誤「VFY:無效的切換目標」,我不知道這個問題的欺騙:http://stackoverflow.com/questions/6025891/switch-case-statements-causes-fatal- error-in-my-android-app – 2012-04-05 22:01:22
這裏只有5種情況,所以可能不是完全相同的問題。該鏈接確實提到了對視圖數量的限制,但沒有詳細說明,我的googlefu也沒有提出任何建議。額外的代碼不需要在案件內部以導致崩潰。 – Zolek 2012-04-06 03:28:05