我的片段出错 "android.app.Application cannot be cast to"
Error on my fragment "android.app.Application cannot be cast to"
紧跟着这个问题:
Using Google Analytics To Track Fragments
我有一个实现 Navigation Drawer
的应用程序,所以它们是 Fragments
但 Google Analytics
在这条线上不起作用:
final Tracker tracker = ((App) getActivity().getApplication()).getTracker();
Fragment
:
public class Accueil extends android.support.v4.app.Fragment {
@Override
public void onResume() {
super.onResume();
final Tracker tracker = ((App) getActivity().getApplication()).getTracker();
if(tracker != null){
tracker.setScreenName(getClass().getSimpleName());
tracker.send(new HitBuilders.ScreenViewBuilder().build());
}
}
}
App
:
public class App extends Application {
private static final String TAG = "App";
public synchronized Tracker getTracker() {
try {
final GoogleAnalytics googleAnalytics = GoogleAnalytics.getInstance(this);
return googleAnalytics.newTracker(R.xml.app_tracker);
}catch(final Exception e){
Log.e(TAG, "Failed to initialize Google Analytics V4");
}
return null;
}
}
MainActivity
Navigation Drawer
:
public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener {
...
}
LOGCAT:
07-09 08:23:06.688 1125-1125/(package) E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to resume activity {(package)/(package).MainActivity}: java.lang.ClassCastException: android.app.Application cannot be cast to (package).App
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2443)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2471)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1985)
at android.app.ActivityThread.access0(ActivityThread.java:122)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassCastException: android.app.Application cannot be cast to (package).App
at (package).Accueil.onResume(Accueil.java:53)
at android.support.v4.app.Fragment.performResume(Fragment.java:1832)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:995)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1120)
at android.support.v4.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:1939)
at android.support.v4.app.FragmentActivity.onResumeFragments(FragmentActivity.java:447)
at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:436)
at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:138)
at android.app.Activity.performResume(Activity.java:4552)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2433)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2471)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1985)
at android.app.ActivityThread.access0(ActivityThread.java:122)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
当我将 App class 放入我的 AndroidManifest 时出错:
on: android:label="@string/app_name" ERROR = (package).App 无法分配给 'Android.app.activity':
<activity
android:name=".App"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.APP" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
此处定义包、应用程序上下文和主要活动的最小清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="my.app.package.name">
<application
android:name=".MyCustomApplicationContext"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".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>
重要的属性是:
- Manifest 标签(根节点)属性 package 定义应用程序包,然后它是所有 class 以 .[=34 开头的路径的前缀=]
- Application 标签属性 android:name 定义 Application Context class 以重载 SDK Application Class
- Activity 标记属性 android:name activity 的名称 class
关于评论如何使用多个应用程序 Class。
首先,这是不可能的 Android 应用程序只能有一个上下文。但是您可以将实现链接起来以分离功能。
这是一个链式应用程序上下文的示例:
基本实现。引入一些有用方法的自定义应用程序上下文:
public class UtilApp extends Application {
...
some useful methods
...
}
通过扩展第一个 Impl 链接应用程序上下文。上下文。这个现在也包括 UtilApp 中的应用程序和所有有用的方法。
public class MyApp extends UtilApp {
...
some useful methods
...
}
使用最高暗示。在链中作为您的上下文。
<application
android:name=".MyApp" ...>
紧跟着这个问题:
Using Google Analytics To Track Fragments
我有一个实现 Navigation Drawer
的应用程序,所以它们是 Fragments
但 Google Analytics
在这条线上不起作用:
final Tracker tracker = ((App) getActivity().getApplication()).getTracker();
Fragment
:
public class Accueil extends android.support.v4.app.Fragment {
@Override
public void onResume() {
super.onResume();
final Tracker tracker = ((App) getActivity().getApplication()).getTracker();
if(tracker != null){
tracker.setScreenName(getClass().getSimpleName());
tracker.send(new HitBuilders.ScreenViewBuilder().build());
}
}
}
App
:
public class App extends Application {
private static final String TAG = "App";
public synchronized Tracker getTracker() {
try {
final GoogleAnalytics googleAnalytics = GoogleAnalytics.getInstance(this);
return googleAnalytics.newTracker(R.xml.app_tracker);
}catch(final Exception e){
Log.e(TAG, "Failed to initialize Google Analytics V4");
}
return null;
}
}
MainActivity
Navigation Drawer
:
public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener {
...
}
LOGCAT:
07-09 08:23:06.688 1125-1125/(package) E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to resume activity {(package)/(package).MainActivity}: java.lang.ClassCastException: android.app.Application cannot be cast to (package).App
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2443)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2471)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1985)
at android.app.ActivityThread.access0(ActivityThread.java:122)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassCastException: android.app.Application cannot be cast to (package).App
at (package).Accueil.onResume(Accueil.java:53)
at android.support.v4.app.Fragment.performResume(Fragment.java:1832)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:995)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1120)
at android.support.v4.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:1939)
at android.support.v4.app.FragmentActivity.onResumeFragments(FragmentActivity.java:447)
at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:436)
at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:138)
at android.app.Activity.performResume(Activity.java:4552)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2433)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2471)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1985)
at android.app.ActivityThread.access0(ActivityThread.java:122)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
当我将 App class 放入我的 AndroidManifest 时出错:
on: android:label="@string/app_name" ERROR = (package).App 无法分配给 'Android.app.activity':
<activity
android:name=".App"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.APP" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
此处定义包、应用程序上下文和主要活动的最小清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="my.app.package.name">
<application
android:name=".MyCustomApplicationContext"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".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>
重要的属性是:
- Manifest 标签(根节点)属性 package 定义应用程序包,然后它是所有 class 以 .[=34 开头的路径的前缀=]
- Application 标签属性 android:name 定义 Application Context class 以重载 SDK Application Class
- Activity 标记属性 android:name activity 的名称 class
关于评论如何使用多个应用程序 Class。 首先,这是不可能的 Android 应用程序只能有一个上下文。但是您可以将实现链接起来以分离功能。 这是一个链式应用程序上下文的示例:
基本实现。引入一些有用方法的自定义应用程序上下文:
public class UtilApp extends Application {
...
some useful methods
...
}
通过扩展第一个 Impl 链接应用程序上下文。上下文。这个现在也包括 UtilApp 中的应用程序和所有有用的方法。
public class MyApp extends UtilApp {
...
some useful methods
...
}
使用最高暗示。在链中作为您的上下文。
<application
android:name=".MyApp" ...>