2013-02-18 28 views
0

我試圖使用LoaderManager API < 11.我試圖通過使用日誌實用程序來查找錯誤。但在logcat中找不到這樣的記錄。這是代碼。應用程序只是試圖從聯繫人中檢索數據。 classcastexception可能的原因是拋出不兼容的類型,我相信代碼中沒有這樣的問題。任何幫助,將不勝感激。ClasscastException on應用程序開始

package com.example.androidcontact; 

import android.net.Uri; 
import android.os.Bundle; 
import android.database.Cursor; 
import android.provider.ContactsContract; 
import android.support.v4.app.ListFragment; 
import android.support.v4.app.LoaderManager; 
import android.support.v4.content.CursorLoader; 
import android.support.v4.content.Loader; 
import android.support.v4.widget.CursorAdapter; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.util.Log; 


public class MainActivity extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor>{ 
    private SimpleCursorAdapter mAdapter; 
    String tag = ""; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d(tag,"onCreated"); 

     mAdapter = new SimpleCursorAdapter(getActivity().getApplicationContext(), 
       android.R.layout.simple_list_item_2, 
       null, 
       new String[]{ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME}, 
       new int[]{android.R.id.text1, android.R.id.text2}, 
       CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 

     setListAdapter(mAdapter); 

     getLoaderManager().initLoader(0, null, this); 
    } 


    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle arg1) { 

     Uri uri = ContactsContract.Contacts.CONTENT_URI; 
     String[]projection = new String[]{ 
       ContactsContract.Contacts._ID, 
       ContactsContract.Contacts.DISPLAY_NAME}; 

     return new CursorLoader(getActivity(), uri, projection, null, null, null);  
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) { 
     mAdapter.swapCursor(arg1); 

    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> arg0) { 
     mAdapter.swapCursor(null); 

    } 
    } 

請不要誤會我的意思。我只是花時間在如何獲得堆棧跟蹤。我仍然不知道如何得到一個在開始時發生的異常。這是我能找到的內容。

02-19 00:35:35.401: W/dalvikvm(533): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
02-19 00:35:43.417: E/AndroidRuntime(533): FATAL EXCEPTION: main 
02-19 00:35:43.417: E/AndroidRuntime(533): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.androidcontact/com.example.androidcontact.MainActivity}: java.lang.ClassCastException: com.example.androidcontact.MainActivity 
02-19 00:35:43.417: E/AndroidRuntime(533): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1569) 
02-19 00:35:43.417: E/AndroidRuntime(533): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
02-19 00:35:43.417: E/AndroidRuntime(533): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
02-19 00:35:43.417: E/AndroidRuntime(533): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
02-19 00:35:43.417: E/AndroidRuntime(533): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-19 00:35:43.417: E/AndroidRuntime(533): at android.os.Looper.loop(Looper.java:123) 
02-19 00:35:43.417: E/AndroidRuntime(533): at android.app.ActivityThread.main(ActivityThread.java:3683) 
02-19 00:35:43.417: E/AndroidRuntime(533): at java.lang.reflect.Method.invokeNative(Native Method) 
02-19 00:35:43.417: E/AndroidRuntime(533): at java.lang.reflect.Method.invoke(Method.java:507) 
02-19 00:35:43.417: E/AndroidRuntime(533): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
02-19 00:35:43.417: E/AndroidRuntime(533): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
02-19 00:35:43.417: E/AndroidRuntime(533): at dalvik.system.NativeStart.main(Native Method) 
02-19 00:35:43.417: E/AndroidRuntime(533): Caused by: java.lang.ClassCastException: com.example.androidcontact.MainActivity 
02-19 00:35:43.417: E/AndroidRuntime(533): at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 
02-19 00:35:43.417: E/AndroidRuntime(533): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561) 
02-19 00:35:43.417: E/AndroidRuntime(533): ... 11 more 

按照清單文件,我需要的應用上薑餅這麼辦的,

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.androidcontact" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="9" 
     android:targetSdkVersion="17" /> 
    <uses-permission android:name="android.permission.READ_CONTACTS"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:name="android.app.Application" 
     > 
     <activity 
      android:name="com.example.androidcontact.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
+0

從LogCat發佈StackTrace – iTech 2013-02-18 19:12:56

+1

碎片是**不是**活動,你似乎開始一個片段,認爲它是一個活動。發佈堆棧跟蹤以及清單。 – 2013-02-18 19:19:08

+0

我做到了。請幫忙。 – Paras 2013-02-18 19:49:16

回答

0

你目前的問題是你試圖開始一個片段作爲一個活動,這不像你親眼看到的那樣工作。 更改您的類,所以它看起來是這樣的:因爲你使用支持

<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id ="@+id/my_fragment" 
    android:name="com.example.androidcontact.MainActivity$MyFragment"> 
</fragment> 

還集成@ hsigmond的建議:

public class MainActivity extends Activity 
{ 

    @Override 
    protected void onCreate(Bundle b) 
    { 
    super.onCreate(b); 
    setContentView (R.layout.main); 
    } 

    public static class MyFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor>{ 
    private SimpleCursorAdapter mAdapter; 
    String tag = ""; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d(tag,"onCreated"); 

     mAdapter = new SimpleCursorAdapter(getActivity().getApplicationContext(), 
             android.R.layout.simple_list_item_2, 
             null, 
             new String[]{ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME}, 
             new int[]{android.R.id.text1, android.R.id.text2}, 
             CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 

     setListAdapter(mAdapter); 

     getActivity().getSupportLoaderManager().initLoader(0, null, this); 
    } 


    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle arg1) { 

     Uri uri = ContactsContract.Contacts.CONTENT_URI; 
     String[]projection = new String[]{ 
     ContactsContract.Contacts._ID, 
      ContactsContract.Contacts.DISPLAY_NAME}; 

     return new CursorLoader(getActivity(), uri, projection, null, null, null);  
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) { 
     mAdapter.swapCursor(arg1); 

    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> arg0) { 
     mAdapter.swapCursor(null); 

    } 
    } 
} 

然後在res/layout創建一個名爲main.xml有它包含一個佈局文件庫(上面的代碼已經有這個改變)。

1

您需要從支持庫

getActivity().getSupportLoaderManager().initLoader(0, null, this); 

使用支持裝載機經理向後兼容。

+0

不,這沒有幫助。 – Paras 2013-02-18 19:34:31