只要我选择一个单选按钮,应用就会停止工作

时间:2015-12-05 23:52:00

标签: android radio-button

我有两个单选按钮,如果选择了一个,我想更改Textview的值。我收到了一个错误。单击我的一个单选按钮时,应用程序停止工作。它在日志中给出了这个错误。

 logged error 
>    /com.example.myapp.mttally E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.myapp.mttally, PID: 15125
    java.lang.IllegalStateException: Could not execute method of the activity
            at android.view.View$1.onClick(View.java:4025)
            at android.view.View.performClick(View.java:4785)
            at android.widget.CompoundButton.performClick(CompoundButton.java:120)
            at android.view.View$PerformClick.run(View.java:19884)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5343)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.view.View$1.onClick(View.java:4020)
            at android.view.View.performClick(View.java:4785)
            at android.widget.CompoundButton.performClick(CompoundButton.java:120)
            at android.view.View$PerformClick.run(View.java:19884)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5343)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at 

    `com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
         Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

..`

我在主文件上的java代码是这个

package com.example.myapp.mttally;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
RadioButton lend;
RadioButton borrow;
TextView toFrom;

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


    TextView toFrom = (TextView) findViewById(R.id.toFrom);

    RadioButton lend = (RadioButton) findViewById(R.id.lend);
    RadioButton borrow = (RadioButton) findViewById(R.id.borrow);


}

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


public void onRadioButtonClicked(View view) {
    // Is the button now checked?

    Boolean checked = ((RadioButton) view).isChecked();

    // Check which radio button was clicked
    switch (view.getId()) {
        case R.id.lend:
            if (checked)
                toFrom.setText("   To");
                break;
        case R.id.borrow:
            if (checked)
                toFrom.setText("   From");
            break;
    }
}
}

这是我的 xml 文件

<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"     
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"  
 tools:context=".MainActivity">

<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"

    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:layout_marginTop="8dp"
    android:id="@+id/linearLayout">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:clickable="false"
        >

        <RadioGroup
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">

            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/radio_button1"
                android:id="@+id/lend"
                android:textSize="16dp"
                android:onClick="onRadioButtonClicked"
                />

            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/radio_button2"
                android:id="@+id/borrow"
                android:textSize="16dp"
                android:onClick="onRadioButtonClicked"
                />
        </RadioGroup>
    </LinearLayout>


</LinearLayout>

<TextView
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:id="@+id/toFrom"
    android:layout_below="@+id/linearLayout"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="78dp" />

</RelativeLayout>

1 个答案:

答案 0 :(得分:2)

每当您撰写TextView toFromRadioButton lend或更常见<type of variable> <variable name>之类的内容时,您都会声明一个新变量。您在两个位置声明了名为twoFromlendborrow的变量:一次在MainActivity类中,一次在onCreate方法中。因此,您的代码有两个不同的变量,都称为toFrom,两个变量称为lend,两个变量称为borrow

考虑lend变量。 lend变量的每个副本都有自己的&#34;范围&#34;,或者它所在的代码区域。由于您在类本身中声明了第一个lend变量(不在任何方法中),因此它的范围是类。您可以(通常)在类中的任何位置使用它。

然而,您的第二个lend变量是导致问题的原因。您已在lend方法中声明了第二个onCreate变量。第二个lend是获取TextView对象的那个...然后在onCreate方法完成执行后它就不再存在了。

因此,要解决此问题,您的onCreate应如下所示:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    toFrom = (TextView) findViewById(R.id.toFrom);
    lend = (RadioButton) findViewById(R.id.lend);
    borrow = (RadioButton) findViewById(R.id.borrow);
}

这样,当你获得对TextView的引用时,你将它保存在调用onRadioButtonClicked时仍然存在的变量中,而不是在将停止的第二个同名变量中。几乎立即存在。