DialogFragment throws a ClassCastException if called from a fragment

My DialogFragment throws a ClassCastException if called from Fragment, although it works fine if called from Activity. I have already considered several other issues with a similar problem, and they are mainly related to import, but I could not solve it in my implementation. Here is my implementation for DialogFragment.

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;

public class HotspotScanDialog extends DialogFragment {

    SetupHotspotDialogListener mListener;

    @Override
    public Dialog onCreateDialog (Bundle savedInstanceState) {
        ...

        .setAdapter (hotspotAdapter, new DialogInterface.OnClickListener () {
            @Override
            public void onClick (DialogInterface dialog, int which) {
                mListener.onHotspotSelectedListener (hotspotAdapter.getItem (
                        which) .toString ());
            }
        }) ...
    }

    public interface SetupHotspotDialogListener {
        public void onHotspotSelectedListener (String selection);

    }

    @Override
    public void onAttach (Activity activity) {
        super.onAttach (activity);

        try {
            mListener = (SetupHotspotDialogListener) activity;
        } catch (ClassCastException ignore) {
            // Just to make sure if anyone will be pointing at my throwing
            // ClassCastException myself I have tried without this code as well.
            throw new ClassCastException (activity.toString ()
                    + "must implement NoticeDialogListener");
        }
    }
}

, DialogFragment:

import android.app.AlertDialog;
import android.app.DialogFragment;
import android.support.v4.app.Fragment;
import com.xxx.yyy.ui.compontent.dialog.HotspotScanDialog;
import com.xxx.yyy.ui.compontent.dialog.HotspotScanDialog.SetupHotspotDialogListener;

public class SmartMode extends Fragment implements SetupHotspotDialogListener {

    private void showWifiSelectionDialog() {
        DialogFragment setupWifiSelectionDialog = new HotspotScanDialog();

        /*
         * using getFragmentManager() only says "The method
         * show(FragmentManager, String) in the type DialogFragment is not
         * applicable for the arguments (FragmentManager, String)"
         */

        setupWifiSelectionDialog.show(getActivity().getFragmentManager(),
                Keys.TAG.toString());
    }

    @Override
    public void onHotspotSelectedListener(String selection) {
        // Log.d(TAG,selection);
    }
}

:

02-01 13: 11: 32.750: E/AndroidRuntime (15061): FATAL EXCEPTION: main 02-01 13: 11: 32.750: E/AndroidRuntime (15061): java.lang.ClassCastException: com.milanix.tuki.UiMainActivity@41d75350 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at com.xxx.yyy.ui.compontent.dialog.HotspotScanDialog.onAttach(HotspotScanDialog.java:122) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:787) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at android.app.BackStackRecord.run(BackStackRecord.java:635) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1397) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at android.app.FragmentManagerImpl $1.run(FragmentManager.java:426) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): android.os.Handler.handleCallback(Handler.java:615) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at android.os.Handler.dispatchMessage(Handler.java:92) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at android.os.Looper.loop(Looper.java:137) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at android.app.ActivityThread.main(ActivityThread.java:4898) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): java.lang.reflect.Method.invokeNative( ) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at java.lang.reflect.Method.invoke(Method.java:511) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:1006) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at dalvik.system.NativeStart.main( )

, - .

+7
2

:

 onAttach(Activity) called once the fragment is associated with its activity.

 mListener = (SetupHotspotDialogListener) activity;

ClassCastException SetupHotspotDialogListener. (Fragment , , DialogFragment DialogFragment Fragment).

, . - , . , .

, FragmentDialog Fragment :

  1. Fragment SmartMode ( dialogFragment) , createDialogRequest().
  2. , , Fragment Activity
  3. " " Activity

, .

: , , . fragment dialog fragment dialog .

:

public class MyFragmentActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_fragment);

        // first start of activity
        if (savedInstanceState == null) {
            // put fragment to activity layout 
            MyFragment fragment = new MyFragment();
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.fragmentContainer, fragment, "fragment");
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            ft.commit();
        }
    }

}

:

public class MyFragment extends Fragment implements MyDialogInterface {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);

        View fragmentView = inflater.inflate(R.layout.fragment, null);

        // button which shows dialog
        Button showDialogButton = (Button) fragmentView.findViewById(R.id.showDialog);
        showDialogButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // create fragment dialog.
                FragmentDialog dialog = FragmentDialog.getInstance(MyFragment.this);
                dialog.show(getActivity().getSupportFragmentManager(), "dialog");
            }
        });

        return fragmentView;
    }

    @Override
    public void onClickEvent() {
        // receive click events from dialog fragment
        Log.e(getClass().getSimpleName(), "onClickEvent");
    }

}

FragmentDialog:

public class FragmentDialog extends DialogFragment {

    public interface MyDialogInterface extends Serializable {
        public void onClickEvent();
    }

    private MyDialogInterface callbackListener;

    /**
     * dialogInterface - instance of MyDialogInterface which will handle
     * callback events
     */
    public static FragmentDialog getInstance(MyDialogInterface dialogInterface) {
        FragmentDialog fragmentDialog = new FragmentDialog();

        // set fragment arguments
        Bundle args = new Bundle();
        args.putSerializable("dialogInterface", dialogInterface);
        fragmentDialog.setArguments(args);

        return fragmentDialog;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(STYLE_NO_TITLE, 0);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View pushDialogView = getActivity().getLayoutInflater().inflate(R.layout.fragment_dialog, null);

        // get reference to MyDialogInterface instance from arguments
        callbackListener = (MyDialogInterface) getArguments().getSerializable("dialogInterface");

        Button cancelButton = (Button) pushDialogView.findViewById(R.id.button);
        cancelButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // send click event
                callbackListener.onClickEvent();
            }
        });

        return pushDialogView;
    }

}

4

android.support.v4.app.Fragment
android.support.v4.app.DialogFragment
android.support.v4.app.FragmentActivity

:

activity_my_fragment.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/fragmentContainer"
   android:layout_width="match_parent"
   android:layout_height="match_parent" />

fragment.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="#a00"
   android:orientation="vertical" >

   <Button
     android:id="@+id/showDialog"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="show doalog" />
</LinearLayout>

fragment_dialog.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="#fe3"
   android:orientation="vertical" >

   <Button
      android:id="@+id/button"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="click me" />
 </LinearLayout>

, , .

+12
public class HotspotScanDialog extends DialogFragment {
    ...
    SetupHotspotDialogListener mListener;
    ...
    @Override
    public void onAttachFragment(Fragment childFragment) {
        super.onAttachFragment(childFragment);
        mListener = (SetupHotspotDialogListener) childFragment;
    }
    ...
}

Fragment, DialogFragment:

HotspotScanDialog dialog = new HotspotScanDialog();
dialog.show(getChildFragmentManager(), "TAG");
0

All Articles