0

API <11 に LoaderManager を使用しようとしています。Logユーティリティを使用してエラーを見つけようとしました。しかし、logcat にはそのような記録はありません。これがコードです。アプリケーションは、単に連絡先からデータを取得しようとします。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>
4

2 に答える 2

1

サポートライブラリのSupportLoaderManagerを使用する必要があります

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

下位互換性のため。

于 2013-02-18T19:26:08.950 に答える
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の提案も組み込んでください(上記のコードにはすでにこの変更があります)。

于 2013-02-18T20:03:50.300 に答える