2013-02-18 7 views
0

Я пытаюсь использовать LoaderManager для API < 11. Я попытался найти ошибку с помощью утилиты Log. Но никакой записи в logcat нет. Вот код. Приложение просто пытается извлечь данные из контактов. Возможные причины для classcastexception - использовать несовместимые типы, я считаю, что в коде нет такой проблемы. Любая помощь будет оценена по достоинству.ClasscastException при запуске приложения

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 

В соответствии с файлом манифеста, мне нужно приложение, чтобы работать на Gingerbread так,

<?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

Опубликовать StackTrace от LogCat – iTech

+1

Фрагменты ** не ** Деятельность, похоже, вы начинаете фрагмент, думая, что это активность. Отправьте трассировку стека, а также ваш манифест. –

+0

сделал. Пожалуйста помоги. – Paras

ответ

0

Ваша текущая проблема заключается в том, что вы пытаетесь запустить фрагмент как действие, которое не работает так, как вы видели из первых рук. Измените класс так, это выглядит следующим образом:

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 есть он содержит:

<?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 в виду того что вы являются используя поддержку библиотека (код выше уже имеет это изменение).

1

Вы должны использовать поддержку Loader менеджер из поддержки библиотеки

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

для Обратная совместимость.

+0

Нет. Это не помогает. – Paras

Смежные вопросы