我的片段错误“android.app.Application无法转换为” [英] Error on my fragment "android.app.Application cannot be cast to"
问题描述
只需遵循以下问题:
使用Google Analytics跟踪片段
我有一个应用程序,它实现了导航抽屉
,所以它们是片段
但
final Tracker tracker =((App)getActivity()。getApplication())。getTracker();
public class Accueil extends android.support.v4.app.Fragment {
:
$ b $ @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());
code $
$ b $ p code $>应用public class App extends Application {
private static final String TAG =应用;
public synchronized Tracker getTracker(){
try {
final GoogleAnalytics googleAnalytics = GoogleAnalytics.getInstance(this);
返回googleAnalytics.newTracker(R.xml.app_tracker);
} catch(final Exception e){
Log.e(标记,初始化Google Analytics V4失败);
}
返回null;
$ b $我有MainActivity
为导航抽屉
:public class MainActivity扩展AppCompatActivity实现FragmentDrawer.FragmentDrawerListener {
...
}
LOGCAT :
07-09 08:23:06.688 1125-1125 /(package)E / AndroidRuntime:致命例外:main
java.lang.RuntimeException:无法恢复活动{(package)/(package).MainActivity}:java.lang.ClassCastException:android.app.Application无法转换为(包).App
在android .app.ActivityThread.performResumeActivity(ActivityThread.java:2443)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2471)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1985 )
在android.app.ActivityThread.access $ 600(ActivityThread.java:122)
在andro在Android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.loopper.loop(Looper.Handler.java:1146)
在android.os.Handler.dispatchMessage(Handler.java:99) java:137)
at android.app.ActivityThread.main(ActivityThread.java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang。方法.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)
在dalvik.system.NativeStart.main(本地方法)
引起:java.lang.ClassCastException:android.app.Application不能转换为(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(Fragm entManager.java:995)在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138
)
在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java: 1120)
在android.support.v4.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:1939)
在android.support.v4.app.FragmentActivity.onResumeFragments(FragmentActivity.java:447)
。在android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:436)
在android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:138)
。在机器人.app.Activity.performResume(Activity.java:4552)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2433)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2471 )
在android.app.ActivityThread.handleLaunchActivity(Activit yThread.java:1985)
。在android.app.ActivityThread.access $ 600(ActivityThread.java:122)$ B $在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1146)
b在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:137)
在android.app.ActivityThread.main(ActivityThread。 java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)$ b $ 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方法)
在我的AndroidManifest中放入App类时发生错误:
on:android:label =@ string / app_nameERROR =(package).App不能分配给'Android.app.activity':
< activity
android:name =。App
android:label =@ string / app_name
android:screenOrientation = 肖像 >
< intent-filter>
< category android:name =android.intent.category.DEFAULT/>
< / intent-filter>
< / activity>
解决方案acitivty:
<?xml version =1.0encoding =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>
< category android:name =android.intent.category.LAUNCHER/>
< / intent-filter>
< / activity>
< / application>
< / manifest>
重要的属性有:
- Manifest标记(根节点)属性程序包定义了apps包,该包是所有以开头的classpathes的前缀。
- 应用程序标签属性 android:name 定义应用程序上下文类以重载SDK应用程序类
- 活动标签属性 android:name 活动类的名称
关于如何使用多于一个应用程序类的评论。
首先,这是不可能的一个Android应用程序只能有一个上下文。但是您可以将实现链接到单独的功能。
这里是一个链式应用程序上下文的例子:
Base Impl。自定义应用程序上下文中引入了一些有用的方法:
pre code public class UtilApp extends Application {
...
一些有用的方法
...
}
第一个Impl。上下文。现在这个应用程序和UtilApp中的所有有用方法都包含在内。
public class MyApp extends UtilApp {
。 ..
一些有用的方法
...
}
使用最高的impl。作为你的上下文链。
< application
android:name =。MyApp...> ;
Just following this question: Using Google Analytics To Track Fragments I have an app which implements a
Navigation Drawer
, so they'reFragments
butGoogle Analytics
don't work on this line:final Tracker tracker = ((App) getActivity().getApplication()).getTracker();
The
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; } }
And I have
MainActivity
for theNavigation 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.access$600(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.access$600(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)
Error when I put App class in my AndroidManifest:
on: android:label="@string/app_name" ERROR = (package).App is not assignable to '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>
解决方案Here minimum manifest defining package, application context and a main acitivty:
<?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>
Important properties are:
- Manifest tag (root node) attribute package defines the apps package which is then prefix for all classpathes starting with .
- Application tag attribute android:name defines the Application Context class to overload the SDK Application Class
- Activity Tag attribute android:name Name of activity class
Regarding comment how about using more then one Application Class. First this is not possible an Android app can only have one Context. But you can chain Implementations to seperate functionality. Here an example of a chained application context:
Base Impl. of a custom Application context introducing some useful methods:
public class UtilApp extends Application { ... some useful methods ... }
Chained Application context by extending first Impl. of Context. This one now includes Application and all Usefull Methods out of UtilApp, too.
public class MyApp extends UtilApp { ... some useful methods ... }
Use the highest impl. in the chain as your Context.
<application android:name=".MyApp" ...>
这篇关于我的片段错误“android.app.Application无法转换为”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!