0

I am using ShowcaseView in an Android App. I want to be able to display the ShowcaseView on top of a DialogFragment. But for me, the ShowcaseView is displaying underneath the DialogFragment.

There are open issues on this subject on github for this project. But I thought that I would ask here as was suggested. This post mentioned that he solved the issue "using a fake activity as a dialogfragment." But I am not sure what that means. Maybe that means that instead of using a DialogFragment, he used an Activity and is displaying it as a DialogFragment? I know that you can set the theme of an activity to be a Dialog in the Manifest: android:theme="@android:style/Theme.Dialog".

The other github issues are here and here.

I am using the "legacy" version of ShowcaseView like this:

ViewTarget target = new ViewTarget(R.id.imageView, getActivity());
ShowcaseView.insertShowcaseView(target, getActivity(), R.string.showcase_title, R.string.showcase_details);
Leo Landau
  • 1,785
  • 17
  • 25

2 Answers2

1

So to get ShowcaseView to display properly on a DialogFragment, we have to show the DialogFragment as a Fragment instead of showing the DialogFragment as a Dialog.

In the DialogFragment, we could have something like this:

public static class MyDialogFragment extends DialogFragment {

public static MyDialogFragment newInstance() {
    return new MyDialogFragment();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.hello_world, container, false);
    View tv = v.findViewById(R.id.text);
    ((TextView)tv).setText("This is an instance of MyDialogFragment");
    return v;
}

That we could show it in an Activity like this:

public class MyDialogActivity extends Activity{

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_contact_manager);
    if (savedInstanceState == null) {
        MyDialogFragment fragment = MyDialogFragment.newInstance();
        getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.frameLayout, fragment, "Some_tag")
            .commit();
    }
}

activity_contact_manager.xml layout could be:

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

And the AndroidManifest.xml entry could be:

<activity
    android:name=".activity.MyDialogActivity"
    android:theme="@android:style/Theme.Dialog" />
Leo Landau
  • 1,785
  • 17
  • 25
0

You should write add a method, change Activity to DialogFragment

private void show(DialogFragment dialog) {
    ((ViewGroup) dialog.getDialog().getWindow().getDecorView()).addView(this);
}

It's working for me.

thor
  • 21,418
  • 31
  • 87
  • 173