我的片段错误“android.app.Application无法转换为” [英] Error on my fragment "android.app.Application cannot be cast to"

查看:284
本文介绍了我的片段错误“android.app.Application无法转换为”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

只需遵循以下问题:
使用Google Analytics跟踪片段
我有一个应用程序,它实现了导航抽屉,所以它们是片段 Google Analytics(分析)不适用于此行:

  final Tracker tracker =((App)getActivity()。getApplication())。getTracker(); 

Fragment :

  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>

重要的属性有:


  1. Manifest标记(根节点)属性程序包定义了apps包,该包是所有以开头的classpathes的前缀。
  2. 应用程序标签属性 android:name 定义应用程序上下文类以重载SDK应用程序类

  3. 活动标签属性 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're Fragments but Google 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 the 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.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:

  1. Manifest tag (root node) attribute package defines the apps package which is then prefix for all classpathes starting with .
  2. Application tag attribute android:name defines the Application Context class to overload the SDK Application Class
  3. 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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆