单选按钮的OnClick事件不起作用

时间:2017-02-28 03:26:56

标签: java android

所以我之前有一个版本。不幸的是,我忘记将工作版本复制到我的USB上,所以我试图在家中复制它。我有5个方向单选按钮。每次检查一个时,都应该更改TextView中的文本以与相关的方向相对应。不幸的是,这似乎不起作用。尝试运行应用程序时,它会崩溃。

调试屏幕也会抛出有关空指针异常的内容。此外,在单选按钮的xml代码中,有一些关于我在Main中找不到的方法。任何帮助表示赞赏。

<RadioButton
    android:text="@string/north"
    android:layout_width="79dp"
    android:layout_height="wrap_content"
    android:layout_marginLeft="12dp"
    android:layout_marginStart="12dp"
    android:layout_marginTop="29dp"
    android:id="@+id/north"
    android:onClick="onClick" />

<RadioButton
    android:text="@string/south"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/south" />

<RadioButton
    android:text="@string/east"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/east" />

<RadioButton
    android:text="@string/west"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/west" />

<RadioButton
    android:text="@string/center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/center" />

</RadioGroup>

<SeekBar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="22dp"
    android:id="@+id/speed"
    android:layout_below="@+id/Speed"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

的活动:

public class MainActivity extends AppCompatActivity {
    RadioButton n, s, e, w, c;
    // TextView text = (TextView)findViewById(R.id.text);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public View.OnClickListener optionOnClickListener;

    {
        optionOnClickListener = new OnClickListener() {

            public View v;

            public void onClick(View v) {
                this.v = v;
                TextView text = (TextView) findViewById(R.id.text);
                String str = null;
                n = (RadioButton) findViewById(R.id.north);
                s = (RadioButton) findViewById(R.id.south);
                e = (RadioButton) findViewById(R.id.east);
                w = (RadioButton) findViewById(R.id.west);
                c = (RadioButton) findViewById(R.id.center);


                // you can simply copy the string of clicked button.
                str = ((RadioButton) v).getText().toString();
                text.setText(str);

                // or, you can check each radiobutton and find which one is checked.
                if (n.isChecked()) {
                    text.setText("North");
                } else if (s.isChecked()) {
                    text.setText("South");
                } else if (e.isChecked()) {
                    text.setText("East");
                } else if (w.isChecked()) {
                    text.setText("West");
                } else if (c.isChecked()) {
                    text.setText("Center");
                }

            }

        };
    }

}

2 个答案:

答案 0 :(得分:0)

因为您正在使用XML设置onClick方法:

public View.OnClickListener optionOnClickListener;

{
    optionOnClickListener = new OnClickListener() {

        public View v;

 //delete above here
        public void onClick(View v) {
            this.v = v; //delete this
            TextView text = (TextView) findViewById(R.id.text);
            String str = null;
            n = (RadioButton) findViewById(R.id.north);
            s = (RadioButton) findViewById(R.id.south);
            e = (RadioButton) findViewById(R.id.east);
            w = (RadioButton) findViewById(R.id.west);
            c = (RadioButton) findViewById(R.id.center);


            // you can simply copy the string of clicked button.
            str = ((RadioButton) v).getText().toString();
            text.setText(str);

            // or, you can check each radiobutton and find which one is checked.
            if (n.isChecked()) {
                text.setText("North");
            } else if (s.isChecked()) {
                text.setText("South");
            } else if (e.isChecked()) {
                text.setText("East");
            } else if (w.isChecked()) {
                text.setText("West");
            } else if (c.isChecked()) {
                text.setText("Center");
            }

        }

//delete below here

    };
}

应该是:

//remove unneccesary variable and wrapper

public void onClick(View v) {
    ... // keep all the lines in this method except this.v = v;
}

之后它应该编译,虽然我要做的是在onCreate中执行所有findViewById(...),而不是每次点击都执行它们

答案 1 :(得分:0)

好的,事实证明我甚至不需要听众,因为图书馆似乎在照顾它。此外,我认为尼克卡多索说他们说onClick是保留的。这是漫长的一天。谢谢大家的帮助!晚安。