tlzlczl 2023-03-15 15:54 采纳率: 100%
浏览 47
已结题

Android studio定义的按钮事件点击闪退怎么解决

Android studio 中,设置三个按钮,两个按钮分别禁用和启用第三个按钮,同时改变第三个按钮的颜色。
点击按钮app就会闪退,log里报错如下。报错位置在代码注释里
FATAL EXCEPTION: main
Process: com.my.test, PID: 23639
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setEnabled(boolean)' on a null object reference
at com.my.test.MainActivity$MyOnClickListener.onClick(MainActivity.java:46)
具体运行java代码如下:
public class MainActivity extends AppCompatActivity {
    private TextView test0;
    private Button result1;

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

        test0 = findViewById(R.id.test0);
        Button enable1 = findViewById(R.id.enable1);
        enable1.setOnClickListener(new MyOnClickListener());
        Button disable1 = findViewById(R.id.disable1);
        disable1.setOnClickListener(new MyOnClickListener());
        Button result1 = findViewById(R.id.result1);
        result1.setOnClickListener(new MyOnClickListener());
    }

    class MyOnClickListener implements View.OnClickListener {
        public void onClick(View v) {
            SimpleDateFormat time = new SimpleDateFormat("h:mm:ss");
            if (v.getId() == R.id.enable1) {
                result1.setTextColor(Color.BLACK);

                result1.setEnabled(true);
            } else if (v.getId() == R.id.disable1) {
                result1.setTextColor(Color.GRAY);
                result1.setEnabled(false);
            } else if (v.getId() == R.id.result1) {
                String desc = String.format("%s 你点了按钮: %s",
                        time.format(new Date()), ((Button) v).getText());
                test0.setText(desc);
            }
        }
    }
}

xml文件如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#00aaff"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/enable1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="启用按钮" />
        <Button
            android:id="@+id/disable1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="禁用按钮" />
    </LinearLayout>
    <Button
        android:id="@+id/result1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:enabled="false"
        android:text="结果按钮" />
    <TextView
        android:id="@+id/test0"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这里查看点击结果"
        android:textColor="@color/black"/>
</LinearLayout>

img

尝试把result1的定义放在onclicklistener里也不行。如果放在最外面,result1定义会变成灰色,没有使用到。
改oncreate里的注册监听器也好,改onclick里的也好,能正常运行,实现按钮禁用和恢复功能就可以
  • 写回答

3条回答 默认 最新

  • allyfireshen 2023-03-15 16:09
    关注

    你现在不是重复定义了吗?监听里面使用的是外层定义的result1,而这个是没有初始化的:

    img

    把oncreate里面的定义的去掉,enable和disable也是,修改如下:

    public class MainActivity extends AppCompatActivity {
        private TextView test0;
        private Button result1;
        private Button enable1;
        private Button disable1;
     
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            test0 = findViewById(R.id.test0);
            enable1 = findViewById(R.id.enable1);
            enable1.setOnClickListener(new MyOnClickListener());
            disable1 = findViewById(R.id.disable1);
            disable1.setOnClickListener(new MyOnClickListener());
            result1 = findViewById(R.id.result1);
            result1.setOnClickListener(new MyOnClickListener());
        }
     
        class MyOnClickListener implements View.OnClickListener {
            public void onClick(View v) {
                SimpleDateFormat time = new SimpleDateFormat("h:mm:ss");
                if (v.getId() == R.id.enable1) {
                    result1.setTextColor(Color.BLACK);
     
                    result1.setEnabled(true);
                } else if (v.getId() == R.id.disable1) {
                    result1.setTextColor(Color.GRAY);
                    result1.setEnabled(false);
                } else if (v.getId() == R.id.result1) {
                    String desc = String.format("%s 你点了按钮: %s",
                            time.format(new Date()), ((Button) v).getText());
                    test0.setText(desc);
                }
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月23日
  • 已采纳回答 3月15日
  • 创建了问题 3月15日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来