Gunaseelan
Gunaseelan

Reputation: 15515

ClassCastException in DialogFragment in Android

I am new to Fragments in Android. Just tried to learn about DialogFragment. But it says classcastException.

public class FragmentDialog extends Activity {

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

    void showDialog() {

        FragmentTransaction ft = getFragmentManager().beginTransaction();
        Fragment prev = getFragmentManager().findFragmentByTag("dialog");
        if (prev != null) {
            ft.remove(prev);
        }
        ft.addToBackStack(null);
        DialogFragment newFragment = MyDialogFragment.newInstance(0);
        newFragment.show(getFragmentManager(), "dialog");
    }

    public static class MyDialogFragment extends DialogFragment {

        static MyDialogFragment newInstance(int num) {
            MyDialogFragment f = new MyDialogFragment();

            return f;
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            int style = DialogFragment.STYLE_NORMAL, theme = 0;
            setStyle(style, theme);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.fragment_dialog, container,
                    false);

            Button button = (Button) v.findViewById(R.id.show);
            button.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                     ((FragmentDialog)getActivity()).showDialog(); // Error is in this line.
                }
            });
            return v;
        }
    }
}

LogCat error is:

07-12 15:22:25.241: E/AndroidRuntime(6419): java.lang.ClassCastException: com.example.fragmentexample.FragmentTabs cannot be cast to com.example.fragmentexample.FragmentDialog
07-12 15:22:25.241: E/AndroidRuntime(6419):     at com.example.fragmentexample.FragmentDialog$MyDialogFragment$1.onClick(FragmentDialog.java:74)

Edit 1#

This FragmentDialog is the one tab of FragmentTabs.

public class FragmentTabs extends Activity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final ActionBar bar = getActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);

    ...
    ...
    bar.addTab(bar.newTab()
            .setText("Dialog")
            .setTabListener(new TabListener<FragmentDialog.MyDialogFragment>(
                    this, "Dialog", FragmentDialog.MyDialogFragment.class)));
    ...
    ...
}

This is why ((FragmentDialog)getActivity()).showDialog(); this line returns com.example.fragmentexample.FragmentTabs cannot be cast to com.example.fragmentexample.FragmentDialog. How can I get the activity as MyDialogFragment.

Upvotes: 0

Views: 949

Answers (2)

Meher
Meher

Reputation: 2585

You want to display dialog on click of Button in Fragment.I have my code currently being used.

CustomDialog :

public class CustomDialog extends DialogFragment {


static CustomDialog newInstance() {
    return new CustomDialog();
}

private ProgressDialog mProgressDialog;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    mProgressDialog = new ProgressDialog(getActivity());
    mProgressDialog.setView(new View(getActivity()));
    mProgressDialog.getWindow().setLayout(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
    mProgressDialog.setCancelable(true);
    mProgressDialog.setTitle(getResources().getString(R.string.title));
    mProgressDialog.setMessage(getResources().getString(R.string.message));
    mProgressDialog
            .setProgressStyle(android.R.style.Theme_DeviceDefault_Light);
    mProgressDialog.getWindow().setBackgroundDrawable(
            new ColorDrawable(android.graphics.Color.TRANSPARENT));


    return mProgressDialog;

}

}

Fragment :

public class MainFragment extends Fragment implements OnClickListener {
Button mButton;

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

    View v = inflater.inflate(R.layout.fragment_layout, container, false);
    mButton = (Button) v.findViewById(R.id.button1);
    mButton.setOnClickListener(MainFragment.this);
    return v;

}

void showDialog() {
    CustomDialog dialog= CustomDialog.newInstance();
    dialog.show(getFragmentManager(), "dialog");
}

@Override
public void onClick(View v) {
    showDialog();
}
}

Upvotes: 0

Vigbyor
Vigbyor

Reputation: 2604

You have problem in following constructor.

    static MyDialogFragment newInstance(int num) 
    {
        MyDialogFragment f = new MyDialogFragment();

        return f;
    }

It should be as follows,

   static MyDialogFragment newInstance(int num) 
   {
        MyDialogFragment f = new DialogFragment();        // Change is here.

        return f;
   }

Upvotes: 1

Related Questions