2013-03-19 7 views
0

Я написал простое приложение, которое для начала содержало только одно действие и несколько других классов (не наследуемых от Activity). Теперь я добавил новый класс HandlePrefs, который также наследует от Activity и добавляет новый тег в файл манифеста, соответствующий этому классу.Получение java.lang.classcastexception на Android во время запуска

Теперь я получаю и ошибка java.lang.classcastexception во время запуска (но только при использовании API лвл 15 и выше Это прекрасно работает на старых версиях API

Это файл манифеста:..

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="tal.game.ammelampe.classes" 
    android:versionCode="3" 
    android:versionName="1.2" 
    android:installLocation="preferExternal"> 
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8"/> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 
<application android:icon="@drawable/icon" 
      android:label="Amme Lampe lite" 
      android:allowBackup="true"> 


    <provider android:name=".FeedingProvider" 
       android:authorities="tal.game.ammelampe.FeedingProvider" />   

    <activity android:name="tal.game.ammelampe.classes.AmmeLampeApp" 
       android:label="Amme Lampe Lite" 
       android:configChanges="keyboard|keyboardHidden|orientation" 
       android:screenOrientation="portrait"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <activity android:name="tal.game.ammelampe.classes.HandlePrefs"> 
    </activity> 
</application> 

</manifest> 

Это мой AndroidApp класс (класс запуска)

package tal.game.framework.impl; 


import tal.game.ammelampe.classes.HelpScreen; 
import tal.game.ammelampe.classes.MainMenuScreen; 
import tal.game.ammelampe.classes.Settings; 
import tal.game.framework.App; 
import tal.game.framework.FileIO; 
import tal.game.framework.Graphics; 
import tal.game.framework.Input; 
import tal.game.framework.Screen; 
import android.app.Activity; 
import android.content.Context; 
import android.content.res.Configuration; 
import android.graphics.Bitmap; 
import android.graphics.Bitmap.Config; 
import android.os.Bundle; 
import android.os.PowerManager; 
import android.os.Vibrator; 
import android.os.PowerManager.WakeLock; 
//import android.util.Log; 
import android.view.KeyEvent; 
import android.view.Window; 
import android.view.WindowManager; 


public abstract class AndroidApp extends Activity implements App { 
    AndroidFastRenderView renderView; 
    Graphics graphics; 
    Input input; 
    FileIO fileIO; 
    Screen screen; 
    WakeLock wakeLock; 
    public static Vibrator v; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     //Debug.startMethodTracing(); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; 
     int frameBufferWidth = isLandscape ? 480 : 320; 
     int frameBufferHeight = isLandscape ? 320 : 480; 
     Bitmap frameBuffer = Bitmap.createBitmap(frameBufferWidth, 
       frameBufferHeight, Config.RGB_565); 

     float scaleX = (float) frameBufferWidth / getWindowManager().getDefaultDisplay().getWidth(); 
     float scaleY = (float) frameBufferHeight/getWindowManager().getDefaultDisplay().getHeight(); 

     v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 

     renderView = new AndroidFastRenderView(this, frameBuffer); 
     graphics = new AndroidGraphics(getAssets(), frameBuffer); 
     fileIO = new AndroidFileIO(getAssets()); 

     input = new AndroidInput(this, renderView, scaleX, scaleY); 
     screen = getStartScreen(); 
     setContentView(renderView); 

     PowerManager powerManager = (PowerManager)  getSystemService(Context.POWER_SERVICE); 
     wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "GLGame"); 


    } 

новый класс, который наследует также от деятельности:

package tal.game.ammelampe.classes; 


import tal.game.ammelampe.classes.FeedingDBMetaData.FeedingTableMetaData; 
import tal.game.framework.App; 
import android.app.Activity; 
import android.content.ContentResolver; 
import android.content.ContentValues; 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 



public class HandlePrefs extends Activity{ 


// Definer keys i preferences 
    private static final String INITIALIZED = "initialized"; 
    private static final String name  = "name"; 
private static final String dob  = "dob"; 
private static final String sex  = "sex"; 
private static final String bgColor = "bgcolor"; 
private static final String onOffLamp = "onofflamp"; 




// This variable is set in the LoadingScreen class 
public static Long currentDate; 
public static Long LongDob; 



public static String lName = "";    
public static String lDob;     
public static String lSex;     
public static String lBgColor;    
public static String lOnOffLamp;    





static SharedPreferences myPrefs; 
Activity activity = this; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
} 

Большая часть кода в классе не включена выше, поскольку я уверен, что это не вызывает ошибки. Но в случае, если я ошибаюсь, я буду, конечно, поставить вас, ребята с ним :)

И, наконец, выход LogCat:

03-19 21:51:49.201: W/dalvikvm(3256): threadid=1: thread exiting with uncaught exception (group=0x40ab4228) 
03-19 21:51:49.261: E/AndroidRuntime(3256): FATAL EXCEPTION: main 
03-19 21:51:49.261: E/AndroidRuntime(3256): java.lang.RuntimeException: Unable to start activity ComponentInfo{tal.game.ammelampe.classes/tal.game.ammelampe.classes.AmmeLampeApp}: java.lang.ClassCastException: tal.game.ammelampe.classes.AmmeLampeApp cannot be cast to android.app.Application 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2194) 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2229) 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at android.app.ActivityThread.access$600(ActivityThread.java:139) 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1261) 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at android.os.Looper.loop(Looper.java:154) 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at android.app.ActivityThread.main(ActivityThread.java:4945) 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at dalvik.system.NativeStart.main(Native Method) 
03-19 21:51:49.261: E/AndroidRuntime(3256): Caused by: java.lang.ClassCastException: tal.game.ammelampe.classes.AmmeLampeApp cannot be cast to android.app.Application 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at android.view.Window.getCompatInfo(Window.java:475) 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at android.view.Window$LocalWindowManager.<init>(Window.java:485) 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at android.view.Window.setWindowManager(Window.java:471) 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at android.app.Activity.attach(Activity.java:4517) 
03-19 21:51:49.261: E/AndroidRuntime(3256):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2135) 
03-19 21:51:49.261: E/AndroidRuntime(3256):  ... 11 more 
03-19 21:51:49.281: E/EmbeddedLogger(185): App crashed! Process: tal.game.ammelampe.classes 
03-19 21:51:49.281: E/EmbeddedLogger(185): App crashed! Package: tal.game.ammelampe.classes v3 (1.2) 
03-19 21:51:49.281: E/EmbeddedLogger(185): App crashed! Application Label: Amme Lampe lite 
03-19 21:51:49.281: W/ActivityManager(185): Force finishing activity tal.game.ammelampe.classes/.AmmeLampeApp 

Я попытался modfifying файл манифеста с андроид: имя =» android.app.Application "как прямой дочерний элемент в теге (как это было предложено в других похожих вопросах), но по-прежнему получает ту же ошибку. Что я здесь делаю неправильно?

LogCat с андроид: имя = "android.app.Application" тег в файле манифеста:

03-19 22:00:19.789: E/AndroidRuntime(4154): FATAL EXCEPTION: main 
03-19 22:00:19.789: E/AndroidRuntime(4154): java.lang.RuntimeException: Unable to start activity ComponentInfo{tal.game.ammelampe.classes/tal.game.ammelampe.classes.AmmeLampeApp}: java.lang.ClassCastException: tal.game.ammelampe.classes.AmmeLampeApp cannot be cast to android.app.Application 

Класс App:

package tal.game.framework; 

import android.content.Context; 

public interface App { 
    public Input getInput(); 

    public FileIO getFileIO(); 

    public Graphics getGraphics(); 

    public void setScreen(Screen screen); 

    public Screen getCurrentScreen(); 

    public Screen getStartScreen(); 

    public Context getApplicationContext(); 
} 
+0

Почему вы «реализуете приложение»? – JBirdVegas

+0

Приложение - это просто интерфейс (класс) :) – esser

+0

Я не уверен, что это имеет значение, но 'getApplicationContext()' также является абстрактным методом в ['Context'] (http://developer.android.com/reference/ android/content/Context.html # getApplicationContext()), который наследует действие. Возможно, переименуйте свой метод 'getApplicationContext()' и ваш интерфейс 'App'; давайте рассмотрим его, номенклатура вашего класса «App» может быть более описательной. – JBirdVegas

ответ

0

Вам не нужно реализовать приложение вместо того, чтобы просто расширить активность как этот

Изменить: public abstract class AndroidApp extends Activity implements App {

до: public abstract class AndroidApp extends Activity {

+0

Класс App - это класс, который я реализовал сам и входит в структуру приложения :) – esser

+0

Я думаю, что вы хорошо подойдете для переименования интерфейс – JBirdVegas

0

Класс Ammelameapp, который вы указываете как активность в манифесте, не является результатом Activity. Ваш класс AndroidApp происходит от Activity, но его абстрактный (поэтому он не может использоваться напрямую) и реализует что-то, называемое App, о котором я понятия не имею, что это такое. Я думаю, вам нужно прочитать о том, что означает «Активность и приложение» в Android.

Каждое приложение имеет объект приложения. Вы можете использовать Android по умолчанию, или вы можете расширить его и сделать свой собственный. Приложения могут иметь 1 или несколько видов деятельности, которые являются конкретными классами и должны простираться от Activity. Эти действия перечислены в манифесте внутри приложения. Это перечисление включает полностью квалифицированный путь класса или форму .ClassName для локальной активности.

+0

Я включил код класса App выше. Дело в том, что файл манифеста корректен в отношении этого оператора: esser

0

Как JBirdVegas сказал в their comment:

Я не уверен, что это важно, но getApplicationContext() также является абстрактный метод в контексте, который наследуется активность.Возможно, переименуйте свой метод getApplicationContext() и ваш интерфейс App; позволяет лицу его номенклатура вашего класса App может быть более описательной.

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