0

ここAndroid/Javaの初心者ですが、C /C++とObjectPascalで十分に確立されています。5つのImageButtonがあり、1つだけが有効になっています。次に、唯一の有効化ボタンが押されたある時点で、ブール値(enableBtn2..3など)とともに渡されたsetEnabled()を呼び出すことにより、他の4つも有効化されるはずです。しかし、唯一の有効なボタンを押してメンバーnewRung()を呼び出し、次に別のメンバーrefreshMnuButtons()を呼び出すと、setEnabled()親クラスメンバーの呼び出しによって発生したと思われる例外が発生します。抜け穴を指摘しますか?必死に説明を探しましたが、適切な答えが見つからないようです。添付されている私のコードをご覧ください。

public class MyActivity extends Activity {
    private ImageView cell1,cell2,cell3,cell4,cell5,cell6,rungClose;
    private ImageButton mnuBtn1,mnuBtn2,mnuBtn3,mnuBtn4,mnuBtn5;
    private boolean enableBtn1 = true,
            enableBtn2 = false,
            enableBtn3 = false,
            enableBtn4 = false,
            enableBtn5 = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pic_ladder_main);

        // setup toolbar
        TableLayout tbl = (TableLayout)findViewById(R.id.tblToolbar);
        ImageButton mnuBtn1 = new ImageButton(this);

        mnuBtn1.setImageResource(R.drawable.rungopentool);
        mnuBtn1.setEnabled(enableBtn1);
        //setup mnuBtn1 listener

        mnuBtn1.setOnClickListener(new View.OnClickListener() {
            @Override   
            public void onClick(View view) {
                newRung();
            }
        });
        ImageButton mnuBtn2 = new ImageButton(this);

        mnuBtn2.setImageResource(R.drawable.noc);
        mnuBtn2.setEnabled(enableBtn2);
        //setup mnuBtn2 listener

        mnuBtn2.setOnClickListener(new View.OnClickListener() {
            @Override   
            public void onClick(View view) {
                addNOC();
            }
        });
        final ImageButton mnuBtn3 = new ImageButton(this);

        mnuBtn3.setImageResource(R.drawable.ncc); 
        mnuBtn3.setEnabled(enableBtn3);
        //setup mnuBtn3 listener

        mnuBtn3.setOnClickListener(new View.OnClickListener() {
            @Override   
            public void onClick(View view) {
                addNCC();
            }
        });
        ImageButton mnuBtn4 = new ImageButton(this);

        mnuBtn4.setImageResource(R.drawable.process);
        mnuBtn4.setEnabled(enableBtn4);
        //setup mnuBtn4 listener

        mnuBtn4.setOnClickListener(new View.OnClickListener() {
            @Override   
            public void onClick(View view) {
                addProcess();
            }
        });
        ImageButton mnuBtn5 = new ImageButton(this);

        mnuBtn5.setImageResource(R.drawable.coil);
        mnuBtn5.setEnabled(enableBtn5);
        //setup mnuBtn5 listener

        mnuBtn5.setOnClickListener(new View.OnClickListener() {
            @Override   
            public void onClick(View view) {
                addCoil();
            }
        });

        TableRow  mnurow = new TableRow(this);
        mnurow.setBackgroundColor(0x3F000000);

        // display menu
        mnurow.addView(mnuBtn1); 
        mnurow.addView(mnuBtn2);
        mnurow.addView(mnuBtn3); 
        mnurow.addView(mnuBtn4); 
        mnurow.addView(mnuBtn5);

        tbl.addView(mnurow); 
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_pic_ladder_main, menu);
        return true;
    }

    private  void  createRungImages() {
        // TODO
    }

    private void newRung()
    {
        Toast.makeText(this, "New Rung" ,Toast.LENGTH_SHORT).show();
        enableBtn2 = true;
        enableBtn3 = true;
        enableBtn4 = true;
        enableBtn5 = true;
        enableBtn1 = false;
        refreshMnuButtons();
    }
    private void addNOC()
    {
        Toast.makeText(this, "NOC" ,Toast.LENGTH_SHORT).show();
    }
    private void addNCC()
    {
        Toast.makeText(this, "NCC" ,Toast.LENGTH_SHORT).show();
    }
    private void addProcess()
    {
        Toast.makeText(this, "Add Process" ,Toast.LENGTH_SHORT).show();
    }
    private void addCoil()
    {
        Toast.makeText(this, "Coil" ,Toast.LENGTH_SHORT).show();
    }

    public void refreshMnuButtons()
    {
        try {  
            mnuBtn1.setEnabled(enableBtn1);
            mnuBtn2.setEnabled(enableBtn2);
            mnuBtn3.setEnabled(enableBtn3);
            mnuBtn4.setEnabled(enableBtn4);
            mnuBtn5.setEnabled(enableBtn5);
        }
        catch(Exception e) {Toast.makeText(this, "Exception" ,Toast.LENGTH_SHORT).show(); }
    }
}

これが私のxmlです:ほとんどのグラフィック要素をコードで生成しようとしていることに注意してください。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="false"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="44dp" >

        <ScrollView
            android:id="@+id/scrollView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >

            <TableLayout
                android:id="@+id/ladderSheet"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" >

            </TableLayout>

        </ScrollView>

    </RelativeLayout>

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" >

       <HorizontalScrollView
           android:id="@+id/horizontalScrollView1"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content" >

           <TableLayout
               android:id="@+id/tblToolbar"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content"
               android:scrollbarStyle="outsideInset"
               android:scrollbars="horizontal" >
           </TableLayout>

       </HorizontalScrollView>

    </RelativeLayout>

</RelativeLayout>

前もって感謝します!

4

1 に答える 1

3

2 つの変数を作成していmnuBtnXます。1 つはローカル、もう 1 つはクラス全体です。次のようにボタンを宣言すると:

private  ImageButton mnuBtn1,mnuBtn2,mnuBtn3,mnuBtn4,mnuBtn5;

これらは明らかにクラス変数ですが、onCreate()次を使用します。

ImageButton mnuBtn1 = new ImageButton(this);

イライラすることに (私たち C/C++ の人々にとって)、クラス変数と同じ名前のローカル変数を作成したことを知らせる警告やエラーはスローされません。このローカルmnuBtn1は、クラスのmnuBt1. そのため、クラスはまだrefreshMnuButtons()なので、おそらく NullPointerException を受け取っています。mnuBtn1null

でこれを行うだけonCreate()です:

mnuBtn1 = new ImageButton(this);
于 2012-09-09T19:59:02.713 に答える