0

私は最初の、そして確かにアマチュア的な Android プロジェクトをプログラミングしています。現在、viewpager クラス内にボタンを作成していますが、instantiateItem 内にコードを追加するとビューページャーが失敗するようになりました。たとえば、何もしないコードでも int a = 1; 、重要な行番号であると思われる限り、クラッシュを引き起こします。プログラム全体が問題なく動作します。次に、instantiateItem 内の任意の場所に任意のコードを 1 行追加すると、クラッシュします。Android ビルド ターゲットは 4.0、最小 SDK は 14 です。エミュレーターと Galaxy nexus フォンの両方でクラッシュが発生します。ビューページャー内のコードの全長は、コメントと空白を含めて 1000 行で、それらを削除すると約 850 行になります。

正確なエラー:

VFY: 無効なスイッチ ターゲット 26 (-> 0x9e0) at 0x9c6[1]

VFY: オペコード 0x2b を 0x9c6 で拒否

W/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: 文字/シート/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 のケース領域内にネストされます。ボタンの 1 つの例:

            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;
4

3 に答える 3

0

「通常サイズ」のコード部分 (つまり、10000 行未満) を含む dex VRFY エラー メッセージは、次のいずれかでバグが発生したことを意味します。

  1. Dalvik バイトコード検証ツール。ここに似ている Froyo Dalvik バイトコード検証ツールにバグがありました。Froyo でデプロイ/テストしますか?

  2. Java コンパイラのバグ。Java コンパイラが正しくない Java バイトコードを生成すると、Dalvik バイトコードも正しくなくなります。コンパイルに Eclipse または javac を使用する場合、これはほとんどありません。

  3. デクサーのバグ。デクサーは Java バイトコードを Dalvik バイトコードに変換します。変換プロセスにバグがある場合、不正な Dalvik バイトコードが出力されます。

于 2012-04-07T08:32:57.533 に答える
0

あなたの問題はクラスの長さによるものではないと確信しています。古い J2ME コードが 8000 行もあるのを見たことがあります。これは、コードをすべて 1 つのクラスにまとめているためです (スペースを節約するため)。最新の電話と IDE は、間違いなくより多くをサポートできます。コードの一部を投稿してください。私たちがお手伝いできるかもしれません。

于 2012-04-05T21:55:00.250 に答える
0

すべてのテキスト ビューとボタン コードを instantiateItem メソッドから独自のメソッドに移動し、instantiateItem 内にコードを直接配置する代わりに、ケースごとにこれらのメソッドを呼び出すことで、この問題を回避しました。

于 2012-04-06T07:25:50.693 に答える