0

さまざまな種類のサイコロを振ることをシミュレートするアプリを作成しています。すべてのサイコロは、ボタンでいっぱいの AlertDialog を介して選択されます。これらのボタンのうち 6 つに対して 1 つの OnClickListener を使用したいのですが、そのリスナーを設定しようとすると、Eclipse が NullPointerException をスローします。

    package edu.elon.cs.diceroller;


import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;


public class RollMenuActivity extends Activity {

    private int diceAmount;
    private int diceSides;
    private boolean sum;

    private Button addDiceButton;
    private Button rollDiceButton;
    private ListView diceListView;

    private Button oneButton;
    private Button twoButton;
    private Button threeButton;
    private Button fourButton;
    private Button fiveButton;
    private Button sixButton;

    private Button d4;
    private Button d6;
    private Button d8;
    private Button d12;
    private Button d20;

    private Button sumButton;
    private Button top3Button;
    private Button trimButton;
    private Button avgButton;
    private Button hiLoButton;
    private Button loHiButton;

    private TextView displayQuantity;
    private TextView displayType;
    private TextView displayArrange;

    private OnClickListener addDiceListener = new OnClickListener() {

        @Override
        public void onClick(View aArg0) {

            AlertDialog.Builder alert = new AlertDialog.Builder(
                    RollMenuActivity.this);
            LayoutInflater factory = LayoutInflater
                    .from(RollMenuActivity.this);
            View layout = factory.inflate(R.layout.dice_select, null);
            alert.setView(layout);


            alert.show();

        }
    };
    private OnClickListener rollDiceListener = new OnClickListener() {

        @Override
        public void onClick(View aV) {
            // TODO Auto-generated method stub

        }

    };

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_roll_menu, menu);
        return true;
    }

    private OnClickListener quantityListener = new OnClickListener(){

        @Override
        public void onClick(View v) {
            Button aButton = (Button) v;
            String buttonNumber = aButton.getText().toString();
            diceAmount = Integer.parseInt(buttonNumber.trim());
            displayQuantity.setText(buttonNumber);

        }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_roll_menu);

        addDiceButton = (Button) findViewById(R.id.adddicebutton);
        rollDiceButton = (Button) findViewById(R.id.rolldicebutton);
        diceListView = (ListView) findViewById(R.id.dicelistview);

        addDiceButton.setOnClickListener(addDiceListener);
        rollDiceButton.setOnClickListener(rollDiceListener);

        oneButton = (Button) findViewById(R.id.button1);
        twoButton = (Button) findViewById(R.id.button2);
        threeButton = (Button) findViewById(R.id.button3);
        fourButton = (Button) findViewById(R.id.button4);
        fiveButton = (Button) findViewById(R.id.button5);
        sixButton = (Button) findViewById(R.id.button6);

        oneButton.setOnClickListener(quantityListener);
        twoButton.setOnClickListener(quantityListener);
        threeButton.setOnClickListener(quantityListener);
        fourButton.setOnClickListener(quantityListener);
        fiveButton.setOnClickListener(quantityListener);
        sixButton.setOnClickListener(quantityListener);


        displayQuantity = (TextView) findViewById(R.id.displayquantity);

    }
}


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

    <ListView
        android:id="@+id/dicelistview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/adddicebutton" >

    </ListView>

    <Button
        android:id="@+id/rolldicebutton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="Press or Shake to Roll Dice"
        tools:ignore="HardcodedText" />

    <Button
        android:id="@+id/adddicebutton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/rolldicebutton"
        android:layout_alignParentLeft="true"
        android:text="Add a Dice"
        tools:ignore="HardcodedText" />

</RelativeLayout>

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/diceselectlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="34dp" >

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="1" />

        <Button
            android:id="@+id/buttond4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="d4" />

        <Button
            android:id="@+id/buttonsum"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=" Sum " />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/linearLayout5"
        android:layout_centerHorizontal="true" >

        <Button
            android:id="@+id/button5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="5" />

        <Button
            android:id="@+id/buttond20"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="d20" />

        <Button
            android:id="@+id/buttonhilo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hi-Lo" />
    </LinearLayout>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:text="Type"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/linearLayout2"
        android:layout_alignParentTop="true"
        android:text="Quantity"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignRight="@+id/linearLayout2"
        android:text="Arrange"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <LinearLayout
        android:id="@+id/linearLayout3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/linearLayout2"
        android:layout_below="@+id/linearLayout2" >

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="2" />

        <Button
            android:id="@+id/buttond6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="d6" />

        <Button
            android:id="@+id/buttontop3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Top 3" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/linearLayout3"
        android:layout_below="@+id/linearLayout3" >

        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="3" />

        <Button
            android:id="@+id/buttond8"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="d8" />

        <Button
            android:id="@+id/buttontrim"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Trim " />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/linearLayout4"
        android:layout_below="@+id/linearLayout4" >

        <Button
            android:id="@+id/button4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="4" />

        <Button
            android:id="@+id/buttond12"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="d12" />

        <Button
            android:id="@+id/buttonavg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=" Avg. " />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/linearLayout1"
        android:layout_centerHorizontal="true" >

        <Button
            android:id="@+id/button6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="6" />

        <Button
            android:id="@+id/button17"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="  " />

        <Button
            android:id="@+id/buttonlohi"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Lo-Hi" />
    </LinearLayout>

    <TextView
        android:id="@+id/displayquantity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/linearLayout5"
        android:layout_below="@+id/linearLayout6"
        android:layout_marginTop="17dp"
        android:text=" "
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/displaytype"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/textView4"
        android:layout_centerHorizontal="true"
        android:text=" "
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/displayarrange"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView5"
        android:layout_alignBottom="@+id/textView5"
        android:layout_alignRight="@+id/linearLayout2"
        android:text=" "
        android:textAppearance="?android:attr/textAppearanceMedium" />

</RelativeLayout>
4

1 に答える 1

0

実装のインスタンスを保持する変数を作成する代わりに、メソッドOnClickListenerを実装OnClickListenerしてオーバーライドするクラスを使用しますOnClick

onCreateオブジェクトの新しいインスタンスをボタンに割り当てる際に

Android SDK を使用してオブジェクトをインスタンス化する場合onCreateは、作成時にクラスに依存してオブジェクトをインスタンス化するよりも、より良い方法です。

編集:Integer.parseIntegerあなたが持っていた方法も修正しました。解析できない場合、それらは例外をスローします。

// Create Classes that implement OnClickListener

private class OnAddDiceListener implements OnClickListener
{
    public void onClick(View v)
    {
        LayoutInflater inflater = LayoutInflater.from(v.getContext());

        View layout = inflater.inflate(R.layout.dice_select, null);

        Builder builder = new Builder(v.getContext());
        builder.setView(layout);

        AlertDialog alert = builder.create();
        alert.show();
    }
}

private class OnRollDiceListener implements OnClickListener
{
    public void onClick(View v)
    {

    }
}

private class OnQuantityListener implements OnClickListener
{
    public void onClick(View v)
    {
        Button button = (Button) v;

        try
        {
            diceAmount = Integer.parseInt(button.getText().toString());
        }
        catch(NumberFormatException e)
        {
            diceAmount = 0;
            e.printStackTrace();
        }

        displayQuantity.setText(diceAmount);
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_roll_menu, menu);
    return true;
}

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_roll_menu);

    addDiceButton = (Button) findViewById(R.id.adddicebutton);
    rollDiceButton = (Button) findViewById(R.id.rolldicebutton);
    diceListView = (ListView) findViewById(R.id.dicelistview);

    // Since this is the onCreate method, instantiate the Listeners for the buttons
    addDiceButton.setOnClickListener(new OnAddDiceListener());
    rollDiceButton.setOnClickListener(new OnRollDiceListener());

    oneButton = (Button) findViewById(R.id.button1);
    twoButton = (Button) findViewById(R.id.button2);
    threeButton = (Button) findViewById(R.id.button3);
    fourButton = (Button) findViewById(R.id.button4);
    fiveButton = (Button) findViewById(R.id.button5);
    sixButton = (Button) findViewById(R.id.button6);

    // Instantiate the OnQuantityListener
    oneButton.setOnClickListener(new OnQuantityListener());
    twoButton.setOnClickListener(new OnQuantityListener());
    threeButton.setOnClickListener(new OnQuantityListener());
    fourButton.setOnClickListener(new OnQuantityListener());
    fiveButton.setOnClickListener(new OnQuantityListener());
    sixButton.setOnClickListener(new OnQuantityListener());

    displayQuantity = (TextView) findViewById(R.id.displayquantity);
}
于 2013-05-19T15:30:58.793 に答える