android - 如何在 android 中将 Fragment 转换为接口(interface)类?

标签 android android-fragments

我尝试将 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/

相关文章:

android - Android中查询、备份、删除、插入联系人

android - 在我的 android 项目中使用 prebuild libcurl.a

android - fragment 内的 fragment 选项卡

android - 是否可以在 `FragmentContainerView` 中膨胀包含 `Fragment` 的 View ?

android - 如何防止在方向更改(嵌套 fragment )期间重新加载 Android WebView?

android - fragment 不可分配给 android.app.Activity

android - 从 Jenkins 读取 build.gradle 的 versionName

java - 在 Android 模拟器上创建 UDP 连接

android - IBM Worklight 使用多个 HTML 文件

android - Android fragment 问题