Android Studio报Could not execute method for android:onClick错误求助
问题排查与修复方案
核心崩溃原因
崩溃日志中最底层的报错为 java.lang.ClassCastException: net.sourceforge.jtds.jdbc.JtdsConnection cannot be cast to com.example.acam_try_2.Connection_to_Cities,原因是数据库连接类的返回值类型写错,强行把JDBC原生连接对象转为自定义类,类型不兼容直接触发崩溃。除此之外还有两处配置错误会导致后续功能异常,统一修复如下:
修复步骤
1. 修复数据库连接类 Connection_to_Cities.java
修改conclass方法的返回值类型为JDBC原生Connection,移除错误的强转逻辑:
package com.example.acam_try_2; import android.annotation.SuppressLint; import android.os.StrictMode; import android.util.Log; import java.sql.Connection; import java.sql.DriverManager; public class Connection_to_Cities { String ip,port,db,un,pass; @SuppressLint("NewApi") // 返回值改为原生Connection类型 public Connection conclass(){ ip="192.168.3.10"; db="Cities_names"; un="Stefan"; pass="stefan"; port="1433"; StrictMode.ThreadPolicy tpolicy=new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(tpolicy); Connection con =null; String ConnectionURL=null; try { Class.forName("net.sourceforge.jtds.jdbc.Driver"); ConnectionURL= "jdbc:jtds:sqlserver://"+ip+":"+port+";"+"databaseName="+ db+ ";user="+un+";password="+pass+";"; con= DriverManager.getConnection(ConnectionURL); } catch (Exception ex) { Log.e("ConnectionError : ", ex.getMessage()); } // 直接返回原生连接对象,不要强转自定义类 return con; } }
2. 修复HomeActivity.java的适配器配置
你当前的SimpleAdapter的from参数把两个字段名写到了同一个字符串里,和ListItem中存入的键名不匹配,同时要注意方法名和布局onClick属性的大小写一致:
// 注意:如果布局中按钮的android:onClick属性写的是getData,方法名要改成小写g开头的getData public void GetData(View v) { ListView lstview=(ListView) findViewById(R.id.listView1); List<Map<String,String>> Mydatalist=null; ListItem Mydata=new ListItem(); Mydatalist=Mydata.getlist(); // 修复from数组:两个键名分开写,和ListItem中put的键名完全一致 String [] Fromw= {"City_name","City_id"}; int[] Tow={R.id.City_name,R.id.City_id}; ad=new SimpleAdapter(HomeActivity.this,Mydatalist,R.layout.listlayout,Fromw,Tow); lstview.setAdapter(ad); }
3. 可选优化(避免后续显示异常)
修改列表项布局listlayout.xml的根布局高度为wrap_content,否则每个列表项会占满全屏:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" xmlns:tools="http://schemas.android.com/tools"> <!-- 其余布局内容不变 -->
注意:当前用StrictMode允许主线程网络请求仅适合测试使用,正式开发请将数据库请求逻辑放到子线程/ViewModel中执行,避免触发ANR。
内容的提问来源于stack exchange,提问作者Ștefan Tătărucă
相关产品推荐
相关产品推荐

