android回调失败,片段失败,无法转换为android.content.Context

时间:2013-01-23 22:41:46

标签: android callback android-fragments

我有一个回调类gaGPS,它要求我认为是一个在正常活动中工作正常的上下文但是当我在片段中使用它失败时

这是我的界面类

Public class gaGPS extends Service implements LocationListener {

private final Context mContext;

// Declaring a Location Manager
protected LocationManager locationManager;

private gaGPSinterface gpsu;

public interface gaGPSinterface {
    public void locationChanged(Location newloc);
}


public gaGPS(Context c, gaGPSinterface gpsiface) {
    mCallback = gpsiface;
    //mContext = (Context) gpsiface;
    mContext = c;


    locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
}

剪断

我正在使用FragmentActivity类启动Fragment

public class gaDetailsActivity extends FragmentActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gpsfragment);

}

这是gpsfragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".gpsfragment" >
<fragment
    android:id="@+id/gpsTestFragLayout"
    android:name="id.wilsononline.gcadroid.gpsfragment"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1" />

以下是我正在使用的片段

public class gpsfragment extends Fragment implements gaGPS.gaGPSinterface {

private gaGPS gps;

@Override
public void locationChanged(Location newloc) {
    // TODO Auto-generated method stub

}

@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    View rootView = inflater.inflate(R.layout.gpsdetails, container, false);
    ((TextView) rootView.findViewById(R.id.gpsText1)).setText("testing fragment");

    Context c = getActivity().getApplicationContext();

    gps = new gaGPS(c, (gaGPSinterface) getActivity());

    return rootView;
}

}

我得到的错误是: java.lang.ClassCastException:com.test.app.gpsfragment无法强制转换为android.content.Context

更全面的输出:

E/AndroidRuntime( 3118): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
E/AndroidRuntime( 3118):        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
E/AndroidRuntime( 3118):        at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
E/AndroidRuntime( 3118):        at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
E/AndroidRuntime( 3118):        at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
E/AndroidRuntime( 3118):        at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
E/AndroidRuntime( 3118):        at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)
E/AndroidRuntime( 3118):        at android.com.test.app.Activity.setContentView(Activity.java:1867)
E/AndroidRuntime( 3118):        at id.wilsononline.gcadroid.gaDetailsActivity.onCreate(gaDetailsActivity.java:12)
E/AndroidRuntime( 3118):        at android.com.test.app.Activity.performCreate(Activity.java:5008)
E/AndroidRuntime( 3118):        at android.com.test.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
E/AndroidRuntime( 3118):        at android.com.test.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
E/AndroidRuntime( 3118):        ... 11 more
E/AndroidRuntime( 3118): Caused by: java.lang.ClassCastException: com.test.com.test.app.gaDetailsActivity cannot be cast to id.wilsononli
ne.gcadroid.gaGPS$gaGPSinterface
E/AndroidRuntime( 3118):        at com.test.com.test.app.gpsfragment.onCreateView(gpsfragment.java:49)
E/AndroidRuntime( 3118):        at android.support.v4.com.test.app.Fragment.performCreateView(Fragment.java:1460)
E/AndroidRuntime( 3118):        at android.support.v4.com.test.app.FragmentManagerImpl.moveToState(FragmentManager.java:884)
E/AndroidRuntime( 3118):        at android.support.v4.com.test.app.FragmentManagerImpl.moveToState(FragmentManager.java:1066)
E/AndroidRuntime( 3118):        at android.support.v4.com.test.app.FragmentManagerImpl.addFragment(FragmentManager.java:1168)
E/AndroidRuntime( 3118):        at android.support.v4.com.test.app.FragmentActivity.onCreateView(FragmentActivity.java:280)
E/AndroidRuntime( 3118):        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676)
E/AndroidRuntime( 3118):        ... 21 more

1 个答案:

答案 0 :(得分:1)

public gaGPS(gaGPSinterface gpsu) {
    this.mContext = (Context) gpsu;
    this.gpsu = gpsu;
    // ...
}

在这里,您尝试将gpsu投射到Context。它不是一个;这是一个Fragment。您应该单独传递ContextgaGPSinterface

public gaGPS(Context c, gaGPSinterface gpsu) {
    this.mContext = c;
    this.gpsu = gpsu;
    // ...
}

然后,使用来自.getActivity()的{​​{1}}(返回Activity的子类Context)来调用它:

Fragment