我尝试将 Fragment 的上下文转换为 Android 中的 Interface Listener ...
package com.example.interfacesdemo.interfaces;
import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
public class GenericPostParseController {
Context ctx;
String strName;
AsyncTaskPostCompleteListener listener;
public GenericPostParseController(Activity activity, String name) {
strName = name;
ctx = activity;
System.out.println("==== String Is : " + name);
try {
listener = (AsyncTaskPostCompleteListener) ctx;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnItemClickedListener");
}
new AsyncHttpRequest().execute(name);
}
class AsyncHttpRequest extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
return "Asynk Response ....";
}
protected void onPostExecute(String result) {
listener.onPostTaskCompleted(result, 0);
}
}
}
我的接口(interface)类和 fragment 类是
package com.example.interfacesdemo;
import com.example.interfacesdemo.interfaces.AsyncTaskPostCompleteListener;
import com.example.interfacesdemo.interfaces.GenericPostParseController;
import com.example.interfacesdemo.interfaces.GetClass;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FragmentTwo extends Fragment implements GetClass,AsyncTaskPostCompleteListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
new GenericPostParseController(getActivity(),"Hi");
return inflater.inflate(R.layout.fragment_two, container, false);
}
@Override
public void getName(String name) {
// TODO Auto-generated method stub
//Toast.makeText(getActivity(), "Hi..." + name, Toast.LENGTH_LONG).show();
}
@Override
public void onPostTaskCompleted(String response, int service_code) {
// TODO Auto-generated method stub
System.out.println("=== Response Is : " + response);
}
}
我只想传递 fragment 的上下文并转换为已实现的接口(interface)。但是代码对于 Activity 来说工作得很好,当我在这个调用中执行 getActivity()
时它抛出一个 ClassCastException
:
new GenericPostParseController(getActivity(),"Hi");
我的日志猫是...
03-30 11:41:23.420: D/libEGL(4779): loaded /system/lib/egl/libEGL_genymotion.so
03-30 11:41:23.440: D/(4779): HostConnection::get() New Host Connection established 0xb8c5fb20, tid 4779
03-30 11:41:23.476: D/libEGL(4779): loaded /system/lib/egl/libGLESv1_CM_genymotion.so
03-30 11:41:23.476: D/libEGL(4779): loaded /system/lib/egl/libGLESv2_genymotion.so
03-30 11:41:23.532: W/EGL_genymotion(4779): eglSurfaceAttrib not implemented
03-30 11:41:23.556: D/OpenGLRenderer(4779): Enabling debug mode 0
03-30 11:41:25.280: I/System.out(4779): ==== String Is : Hi
03-30 11:41:25.284: D/AndroidRuntime(4779): Shutting down VM
03-30 11:41:25.284: W/dalvikvm(4779): threadid=1: thread exiting with uncaught exception (group=0xa61de908)
03-30 11:41:25.284: E/AndroidRuntime(4779): FATAL EXCEPTION: main
03-30 11:41:25.284: E/AndroidRuntime(4779): java.lang.ClassCastException: com.example.interfacesdemo.MainActivity@53523bb4 must implement OnItemClickedListener
03-30 11:41:25.284: E/AndroidRuntime(4779): at com.example.interfacesdemo.interfaces.GenericPostParseController.<init>(GenericPostParseController.java:23)
03-30 11:41:25.284: E/AndroidRuntime(4779): at com.example.interfacesdemo.FragmentTwo.onCreateView(FragmentTwo.java:17)
03-30 11:41:25.284: E/AndroidRuntime(4779): at android.app.Fragment.performCreateView(Fragment.java:1695)
03-30 11:41:25.284: E/AndroidRuntime(4779): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
03-30 11:41:25.284: E/AndroidRuntime(4779): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
03-30 11:41:25.284: E/AndroidRuntime(4779): at android.app.BackStackRecord.run(BackStackRecord.java:682)
03-30 11:41:25.284: E/AndroidRuntime(4779): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
03-30 11:41:25.284: E/AndroidRuntime(4779): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441)
03-30 11:41:25.284: E/AndroidRuntime(4779): at android.os.Handler.handleCallback(Handler.java:725)
03-30 11:41:25.284: E/AndroidRuntime(4779): at android.os.Handler.dispatchMessage(Handler.java:92)
03-30 11:41:25.284: E/AndroidRuntime(4779): at android.os.Looper.loop(Looper.java:137)
03-30 11:41:25.284: E/AndroidRuntime(4779): at android.app.ActivityThread.main(ActivityThread.java:5041)
03-30 11:41:25.284: E/AndroidRuntime(4779): at java.lang.reflect.Method.invokeNative(Native Method)
03-30 11:41:25.284: E/AndroidRuntime(4779): at java.lang.reflect.Method.invoke(Method.java:511)
03-30 11:41:25.284: E/AndroidRuntime(4779): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-30 11:41:25.284: E/AndroidRuntime(4779): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-30 11:41:25.284: E/AndroidRuntime(4779): at dalvik.system.NativeStart.main(Native Method)
03-30 11:46:25.556: I/Process(4779): Sending signal. PID: 4779 SIG: 9
这是调用 TwoFragment 的 MainActivity ...
package com.example.interfacesdemo;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void selectFrag(View view) {
Fragment fr;
if(view == findViewById(R.id.button2)) {
fr = new FragmentTwo();
}else {
fr = new FragmentOne();
}
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.commit();
}
}
最佳答案
FragmentTwo 实现了 AsyncTaskPostCompleteListener
,但是 FragmentTwo 的 Activity 没有实现 AsyncTaskPostCompleteListener。
所以它不能转换为 AsyncTaskPostCompleteListener
。
您可以将 GenericPostParseController
的构造函数更改为
public GenericPostParseController(AsyncTaskPostCompleteListener listener, String name) {
}
并将 fragment 的上下文本身传递给
关于android - 如何在 android 中将 Fragment 转换为接口(interface)类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29339906/