【问题标题】:Android with scala setAdapter InvocationTargetExceptionAndroid 与 scala setAdapter InvocationTargetException
【发布时间】:2014-04-05 11:18:43
【问题描述】:

我正在尝试制作包含 ListView 的 android 应用程序。现在我有:

PersonSearchResult.scala:

class PersonSearchResult extends ActionBarActivity {

  def policy:StrictMode.ThreadPolicy = new StrictMode.ThreadPolicy.Builder().permitAll().build()
 StrictMode.setThreadPolicy(policy)

protected override def onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
setContentView(R.layout.person_item)
def img:Int = R.drawable.icon_alert

val intent: Intent = getIntent()
val massage: String = makeJson(intent.getExtras())
val url:String = """http://www.some.url/?info=""" + URLEncoder.encode(massage, "utf-8")
val data:JSONArray = getSearchResult(url)
val dataLength = data.length

val dataList: ArrayList[HashMap[String, Any]] = new ArrayList[HashMap[String, Any]](dataLength)

for( i <- 0 to (dataLength - 1)){
  val m = new HashMap[String, Any]()
  m.put("name", data.getJSONObject(i).getString("name"))
  m.put("midname", data.getJSONObject(i).getString("midname"))
  m.put("lastname", data.getJSONObject(i).getString("lastname"))
  if (data.getJSONObject(i).getBoolean("wanted"))
    m.put("wanted", img)
  else
    m.put("wanted", 0)
  dataList.add(m)
}

val from = Array("name","midname","lastname", "wanted")
val to = Array(R.id.pers_name, R.id.pers_midname, R.id.pers_lastname,R.id.isWanted)

val adapter: SimpleAdapter = new SimpleAdapter(this, dataList, R.layout.person_item,from, to)

val listView: ListView = findViewById(R.id.listview).asInstanceOf[ListView]
listView.setAdapter(adapter)


listView.setOnItemClickListener( new OnItemClickListener() {
    def onItemClick(parent: AdapterView[_], view: View, position: Int, id: Long) : Unit = {
        val info = data.getJSONObject(id.asInstanceOf[Int])
        val intent: Intent = new Intent(PersonSearchResult.this, classOf[PersonProfile])
        intent.putExtra("info",info.toString())
        startActivity(intent)
    }
})

 }


override def onCreateOptionsMenu(menu: Menu): Boolean =  {

    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.person_search_result, menu)
    true
}

override def onOptionsItemSelected(item: MenuItem): Boolean =  {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    if (item.getItemId() == R.id.action_settings) {
        true
    }
    super.onOptionsItemSelected(item)
}

/**
 * A placeholder fragment containing a simple view.
 */
class PlaceholderFragment extends Fragment {

    override def onCreateView(inflater: LayoutInflater, container:  ViewGroup, savedInstanceState: Bundle): View = {
        inflater.inflate(R.layout.fragment_person_search_result, container, false)
    }
}

}

还有 fragment_person_search_result.xml :

<LinearLayout 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:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="mephi.BukarevP.client.PersonSearchResult$PlaceholderFragment" >

<ListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
</ListView>

</LinearLayout>

这很奇怪,但 logcat 和控制台没有显示错误。使用调试我发现应用程序在 listView.setAdapter(adapter) 处因 InvocationTargetException 或类似的东西而崩溃。 我做错了什么?任何想法如何解决它?

另外,我得到了日志:

04-05 20:39:33.270: D/libEGL(20346): loaded /system/lib/egl/libEGL_mali.so
04-05 20:39:33.275: D/libEGL(20346): loaded /system/lib/egl/libGLESv1_CM_mali.so
04-05 20:39:33.275: D/libEGL(20346): loaded /system/lib/egl/libGLESv2_mali.so
04-05 20:39:33.280: E/(20346): Device driver API match
04-05 20:39:33.280: E/(20346): Device driver API version: 17
04-05 20:39:33.280: E/(20346): User space API version: 17 
04-05 20:39:33.280: E/(20346): mali: REVISION=Linux-r3p1-01rel1 BUILD_DATE=Fri May 10 18:36:49 KST 2013 
04-05 20:39:33.325: D/OpenGLRenderer(20346): Enabling debug mode 0
04-05 20:39:43.835: D/AndroidRuntime(20346): Shutting down VM
04-05 20:39:43.835: W/dalvikvm(20346): threadid=1: thread exiting with uncaught exception (group=0x40fe1930)
04-05 20:39:43.840: E/AndroidRuntime(20346): FATAL EXCEPTION: main
04-05 20:39:43.840: E/AndroidRuntime(20346): java.lang.RuntimeException: Unable to start activity ComponentInfo{mephi.BukarevP.client/mephi.BukarevP.client.PersonSearchResult}: java.lang.NullPointerException
04-05 20:39:43.840: E/AndroidRuntime(20346):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2249)
04-05 20:39:43.840: E/AndroidRuntime(20346):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299)
04-05 20:39:43.840: E/AndroidRuntime(20346):    at android.app.ActivityThread.access$700(ActivityThread.java:154)
04-05 20:39:43.840: E/AndroidRuntime(20346):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
04-05 20:39:43.840: E/AndroidRuntime(20346):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-05 20:39:43.840: E/AndroidRuntime(20346):    at android.os.Looper.loop(Looper.java:137)
04-05 20:39:43.840: E/AndroidRuntime(20346):    at android.app.ActivityThread.main(ActivityThread.java:5306)
04-05 20:39:43.840: E/AndroidRuntime(20346):    at java.lang.reflect.Method.invokeNative(Native Method)
04-05 20:39:43.840: E/AndroidRuntime(20346):    at java.lang.reflect.Method.invoke(Method.java:511)
04-05 20:39:43.840: E/AndroidRuntime(20346):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
04-05 20:39:43.840: E/AndroidRuntime(20346):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
04-05 20:39:43.840: E/AndroidRuntime(20346):    at dalvik.system.NativeStart.main(Native Method)
04-05 20:39:43.840: E/AndroidRuntime(20346): Caused by: java.lang.NullPointerException
04-05 20:39:43.840: E/AndroidRuntime(20346):    at mephi.BukarevP.client.PersonSearchResult.onCreate(PersonSearchResult.scala:65)
04-05 20:39:43.840: E/AndroidRuntime(20346):    at android.app.Activity.performCreate(Activity.java:5255)
04-05 20:39:43.840: E/AndroidRuntime(20346):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
04-05 20:39:43.840: E/AndroidRuntime(20346):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2213)
04-05 20:39:43.840: E/AndroidRuntime(20346):    ... 11 more
04-05 20:40:28.640: I/Process(20346): Sending signal. PID: 20346 SIG: 9
04-05 20:40:28.800: D/dalvikvm(20656): newInstance failed: no <init>()
04-05 20:40:28.800: D/AndroidRuntime(20656): Shutting down VM
04-05 20:40:28.800: W/dalvikvm(20656): threadid=1: thread exiting with uncaught exception (group=0x40fe1930)
04-05 20:40:28.805: E/AndroidRuntime(20656): FATAL EXCEPTION: main
04-05 20:40:28.805: E/AndroidRuntime(20656): java.lang.RuntimeException: Unable to start activity ComponentInfo{mephi.BukarevP.client/mephi.BukarevP.client.MainActivity}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment mephi.BukarevP.client.MainActivity$PlaceholderFragment: make sure class name exists, is public, and has an empty constructor that is public
04-05 20:40:28.805: E/AndroidRuntime(20656):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2249)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at android.app.ActivityThread.access$700(ActivityThread.java:154)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at android.os.Looper.loop(Looper.java:137)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at android.app.ActivityThread.main(ActivityThread.java:5306)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at java.lang.reflect.Method.invokeNative(Native Method)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at java.lang.reflect.Method.invoke(Method.java:511)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at dalvik.system.NativeStart.main(Native Method)
04-05 20:40:28.805: E/AndroidRuntime(20656): Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment mephi.BukarevP.client.MainActivity$PlaceholderFragment: make sure class name exists, is public, and has an empty constructor that is public
04-05 20:40:28.805: E/AndroidRuntime(20656):    at android.support.v4.app.Fragment.instantiate(Fragment.java:413)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at android.support.v4.app.FragmentState.instantiate(Fragment.java:97)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1801)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:213)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:97)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at mephi.BukarevP.client.MainActivity.onCreate(MainActivity.scala:19)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at android.app.Activity.performCreate(Activity.java:5255)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2213)
04-05 20:40:28.805: E/AndroidRuntime(20656):    ... 11 more
04-05 20:40:28.805: E/AndroidRuntime(20656): Caused by: java.lang.InstantiationException: can't instantiate class mephi.BukarevP.client.MainActivity$PlaceholderFragment; no empty constructor
04-05 20:40:28.805: E/AndroidRuntime(20656):    at java.lang.Class.newInstanceImpl(Native Method)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at java.lang.Class.newInstance(Class.java:1319)
04-05 20:40:28.805: E/AndroidRuntime(20656):    at android.support.v4.app.Fragment.instantiate(Fragment.java:402)
04-05 20:40:28.805: E/AndroidRuntime(20656):    ... 19 more

【问题讨论】:

  • 检查你的项目目标sdk级别和ActionBarActivity需要sdk级别。
  • @MdAbdulGafur 根据 AndroidManifest.xml targetSdkVersion="19"。据我所知,ActionBarActivity 需要 18 个。

标签: android scala listview simpleadapter


【解决方案1】:

这是来自您的堆栈跟踪的重要线索:

...
Caused by: java.lang.InstantiationException: can't instantiate class mephi.BukarevP.client.MainActivity$PlaceholderFragment; no empty constructor
...

Android 需要一种自行重新实例化 Fragment 的方法。因此,它要求每个 Fragment 都有一个空的构造函数。您的 Fragment 有一个空的构造函数,但它仍然不能被 Android 调用。原因是您将其定义为内部类,它只能与周围类的实例一起存在。而且,当它是一个内部类时,Android 也不知道如何实例化您的 Fragment。在 Java 中,您可以通过将 Fragment 设为 static 内部类来解决此问题。在 Scala 中,您应该将 Fragment 移出 Activity 或将其嵌套在 Activity 的同伴中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多