简体   繁体   中英

Unable to instantiate activity ComponentInfo can't instantiate class

Thank you in advance to everyone who takes a look at this question, especially to those who try to answer! This website has been of great help to me!

I am currently experiencing the following error in my Android 4.2.2 app. Below is the logcat:

09-09 01:14:27.008: D/dalvikvm(9008): newInstance failed: p0 i0 [0 a1
09-09 01:14:27.008: D/AndroidRuntime(9008): Shutting down VM
09-09 01:14:27.008: W/dalvikvm(9008): threadid=1: thread exiting with uncaught exception (group=0x41173ac8)
09-09 01:14:27.018: E/AndroidRuntime(9008): FATAL EXCEPTION: main
09-09 01:14:27.018: E/AndroidRuntime(9008): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.pocketbotanist/com.pocketbotanist.HomeScreen}: java.lang.InstantiationException: can't instantiate class com.pocketbotanist.HomeScreen
09-09 01:14:27.018: E/AndroidRuntime(9008):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173)
09-09 01:14:27.018: E/AndroidRuntime(9008):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2297)
09-09 01:14:27.018: E/AndroidRuntime(9008):     at android.app.ActivityThread.access$700(ActivityThread.java:152)
09-09 01:14:27.018: E/AndroidRuntime(9008):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282)
09-09 01:14:27.018: E/AndroidRuntime(9008):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-09 01:14:27.018: E/AndroidRuntime(9008):     at android.os.Looper.loop(Looper.java:137)
09-09 01:14:27.018: E/AndroidRuntime(9008):     at android.app.ActivityThread.main(ActivityThread.java:5328)
09-09 01:14:27.018: E/AndroidRuntime(9008):     at java.lang.reflect.Method.invokeNative(Native Method)
09-09 01:14:27.018: E/AndroidRuntime(9008):     at java.lang.reflect.Method.invoke(Method.java:511)
09-09 01:14:27.018: E/AndroidRuntime(9008):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
09-09 01:14:27.018: E/AndroidRuntime(9008):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
09-09 01:14:27.018: E/AndroidRuntime(9008):     at dalvik.system.NativeStart.main(Native Method)
09-09 01:14:27.018: E/AndroidRuntime(9008): Caused by: java.lang.InstantiationException: can't instantiate class com.pocketbotanist.HomeScreen
09-09 01:14:27.018: E/AndroidRuntime(9008):     at java.lang.Class.newInstanceImpl(Native Method)
09-09 01:14:27.018: E/AndroidRuntime(9008):     at java.lang.Class.newInstance(Class.java:1319)
09-09 01:14:27.018: E/AndroidRuntime(9008):     at android.app.Instrumentation.newActivity(Instrumentation.java:1071)
09-09 01:14:27.018: E/AndroidRuntime(9008):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2164)
09-09 01:14:27.018: E/AndroidRuntime(9008):     ... 11 more

I have tried a project clean, tried to Android Private Library fix I saw somewhere else, and checked my package names (unless I'm missing something, which I might be!). Here's homescreen.java:

package com.pocketbotanist;

import java.io.File;

import android.app.ListActivity;
import android.app.LoaderManager;
import android.content.Intent;
import android.content.Loader;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;

import com.pocketbotanist.contentprovider.MyEntryContentProvider;
import com.pocketbotanist.database.EntryTable;



public abstract class HomeScreen extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor> {

    private static final int DELETE_ID = Menu.FIRST + 1;
    // private Cursor cursor;
    private SimpleCursorAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home_screen);
        this.getListView().setDividerHeight(2);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        //Initial folder creation code
        File appDirectory = new File(Environment.getExternalStorageDirectory().toString()+"/Pocket Botanist/");
        if (!appDirectory.exists()){
            appDirectory.mkdir();
        }

        //Drop down list code
        Spinner spinner = (Spinner) findViewById(R.id.action_spinner);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.action_list, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);


        fillData();
        //View listItem=(View)((Menu) this.getListView()).getItem(0);
        registerForContextMenu(getListView());
        if (adapter.isEmpty())
            System.out.println("IT'S EMPTY");
        String[] projection = { EntryTable.COLUMN_CUSTOMID };
        long info =  adapter.getItemId(0);
        Uri uri = Uri.parse(MyEntryContentProvider.CONTENT_URI + "/"
                + info);
        Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
        cursor.moveToFirst();
        System.out.println((cursor.getString(cursor
                    .getColumnIndexOrThrow(EntryTable.COLUMN_CUSTOMID))));
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }


    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case DELETE_ID:
            String[] projection = { EntryTable.COLUMN_PHOTOS };
            AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
            .getMenuInfo();
            Uri uri = Uri.parse(MyEntryContentProvider.CONTENT_URI + "/"
                    + info.id);
            Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
            cursor.moveToFirst();
            File temp = new File(cursor.getString(cursor
                    .getColumnIndexOrThrow(EntryTable.COLUMN_PHOTOS)));
            if(temp.exists()){
                File[] files = temp.listFiles();
                for(int i = 0; i < files.length; i++){
                    files[i].delete();
                }
                temp.delete();
            }
            getContentResolver().delete(uri, null, null);
            fillData();
            return true;
        }

        return super.onContextItemSelected(item);

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_home_screen, menu);
        //SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
        case R.id.menu_settings:
            settCall();
            return true;
        case R.id.menu_map:
            map1_3();
            return true;
        case R.id.menu_edit:
            entryScreen("New Entry");
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    public void entryScreen(String t){
        Intent intent = new Intent(this, EntryScreen.class);
        intent.putExtra("passer", t);
        startActivity(intent);
    }

    public void settCall(){
        Intent sett = new Intent(this,SettingsActivity.class);
        startActivity(sett);
    }

    public void map1_3(){

        Intent map13 = new Intent(this,Entrymap_1_3.class);
        startActivity(map13);
    }


    // Opens the second activity if an entry is clicked
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Intent i = new Intent(this, EntryScreen.class);
        Uri itemUri = Uri.parse(MyEntryContentProvider.CONTENT_URI + "/" + id);
        i.putExtra(MyEntryContentProvider.CONTENT_ITEM_TYPE, itemUri);

        startActivity(i);
    }

    //@Override
    //When we create the loader we're going to get the projection for the ID, customID, species name, and time columns
    //(insures that these exist within the database)
    //then we create our cursor loader which will be responsible for loading data from the database
    //using the projection and our content provider
    /* public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
        String[] projection = { EntryTable.COLUMN_ID, EntryTable.COLUMN_CUSTOMID, EntryTable.COLUMN_SPECIES, EntryTable.COLUMN_TIME, EntryTable.COLUMN_PHOTOS, EntryTable.COLUMN_PHOTO };
        CursorLoader cursor = new CursorLoader(this,
                MyEntryContentProvider.CONTENT_URI, projection, null, null, null);
        if (cursor != null) {
            ((Cursor) cursor).moveToFirst();
        }

        return cursor;
    } */

    private void fillData() {

        // Fields from the database (projection)
        String[] from = new String[] { EntryTable.COLUMN_CUSTOMID, EntryTable.COLUMN_SPECIES , EntryTable.COLUMN_TIME, EntryTable.COLUMN_PHOTO};
        // Fields on the UI to which we map
        int[] to = new int[] { R.id.customidlabel, R.id.namelabel, R.id.timelabel, R.id.imageView };

        getLoaderManager().initLoader(1, null, this);       //changed to 1
        adapter = new SimpleCursorAdapter(this, R.layout.list_row, null, from, to, 0);

        setListAdapter(adapter);
    }

    @Override
      public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0, DELETE_ID, 0, R.string.menu_delete);
      }


    @Override
    public void onLoadFinished(Loader<Cursor> arg0, Cursor data) {
        adapter.swapCursor(data);       
    }

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

}

I understand the problem might be here, so here is my AndroidManifest.xml file as well:

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

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="18" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true"/>

    <permission
        android:name="com.pocketbotanist.permission.MAPS_RECEIVE"
        android:protectionLevel="signature"/>
<uses-permission android:name="com.pocketbotanist.permission.MAPS_RECEIVE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:configChanges="keyboardHidden|orientation" >
        <activity
            android:name="com.pocketbotanist.HomeScreen"
            android:label="@string/main" >

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.pocketbotanist.EntryScreen"
            android:label="@string/title_activity_entry_screen"
            android:windowSoftInputMode="stateHidden" 
            >
        </activity>
        <activity
            android:name="com.pocketbotanist.SettingsActivity"
            android:label="@string/title_activity_settings" >
        </activity>
        <activity
            android:name="com.pocketbotanist.ManualLocationActivity"
            android:label="@string/title_activity_manual_location" >
        </activity>
        <activity
            android:name="com.pocketbotanist.Entrymap_1_3"
            android:label="@string/title_activity_entrymap_1_3" >
        </activity>
        <activity
            android:name="com.pocketbotanist.Location_2_3"
            android:label="@string/title_location_2_3" >
        </activity>
        <activity
            android:name="com.pocketbotanist.Mapfragmentpreview"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/title_activity_mapfragmentpreview"
            android:theme="@style/FullscreenTheme" >
        </activity>

         <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="(removing key for security reasons)" />
         <uses-library  
       android:name="com.google.android.maps"  
       android:required="true" />

         <provider
      android:name="com.pocketbotanist.contentprovider.MyEntryContentProvider"
      android:authorities="com.pocketbotanist.contentprovider" 
      android:exported="false">
   </provider>
    </application>

</manifest>

Does anyone have any ideas/suggestions? Thanks again in advance!

Abstract classes are by definition not instantiable.

change

public abstract class HomeScreen extends ListActivity 

to

public class HomeScreen extends ListActivity 

Your class is an abstract classes.

Abstract classes are by definition not instantiable.

private class are not instantiable:

Replace below code, public abstract class HomeScreen extends ListActivity implements LoaderManager.LoaderCallbacks

to:

public class HomeScreen extends ListActivity implements LoaderManager.LoaderCallbacks

It will work.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM