ImageButton.setEnabled()抛出异常

时间:2012-09-09 19:46:33

标签: android

Android / Java中的新手,但在C / C ++&对象Pascal。我有5个ImageButtons只启用了一个。然后在按下单独启用按钮的某个时间点,通过调用带有布尔值(enableBtn2..3 ..等)传递的setEnabled(),也可以启用其他四个按钮。但每当我按下单独的启用按钮来调用成员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>

提前致谢!

1 个答案:

答案 0 :(得分:3)

您正在创建两个mnuBtnX变量:一个是本地变量,另一个是类。当你声明这样的按钮时:

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

这些显然是类变量,但是在onCreate()中使用:

ImageButton mnuBtn1 = new ImageButton(this);

令人沮丧(对于我们C / C ++民谣),这并不会引发警告或错误,告诉您已创建了一个与类变量同名的局部变量。此本地mnuBtn1与“mnuBt1”类无关。所以在refreshMnuButtons()中你可能会收到一个NullPointerException,因为类“mnuBtn1仍然是null

简单onCreate()中执行此操作:

mnuBtn1 = new ImageButton(this);