1

I've tried to create custom Dialog with ImageView, 2 xTextViews, 3 xRadioButtons and 2xButtons. Of course I couldn't make it as regular Dialog (because of variety of Views used), so I've decided to create custom layout and a Class which would take care of setting it all up. Everything seemed to be fine, until I builded it.
Dialog showed only ImageView and first TextView but other Views were gone.

DialogBox

Should look like this:

enter image description here

Thats my code - layout:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/dark_site_gray">

    <Button
        android:id="@+id/button4"
        android:layout_width="172dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="12dp"
        android:background="@color/igloo_theme_color"
        android:text="OK"
        android:textColor="@color/mdtp_white"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/button"
        app:layout_constraintTop_toBottomOf="@+id/radioButton4" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_marginTop="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@color/burgrundy" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="327dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="16dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:gravity="center_horizontal"
        android:text="TextView"
        android:textColor="@color/mdtp_white"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/imageView2" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginEnd="16dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:gravity="center_horizontal"
        android:text="TextView"
        android:textColor="@color/mdtp_white"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <RadioButton
        android:id="@+id/radioButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="24dp"
        android:buttonTint="@color/mdtp_white"
        android:text="Akceptuj"
        android:textColor="@color/mdtp_white"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView2" />

    <RadioButton
        android:id="@+id/radioButton2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:buttonTint="@color/mdtp_white"
        android:text="Odrzuć"
        android:textColor="@color/mdtp_white"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/radioButton" />

    <RadioButton
        android:id="@+id/radioButton4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:buttonTint="@color/mdtp_white"
        android:text="Przekaż dalej"
        android:textColor="@color/mdtp_white"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/radioButton2" />

    <Button
        android:id="@+id/button"
        android:layout_width="172dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="12dp"
        android:background="@color/igloo_theme_color"
        android:text="Anuluj"
        android:textColor="@color/mdtp_white"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/radioButton4" />

</android.support.constraint.ConstraintLayout>

Class:

public class DialogCreator extends Dialog {
    public DialogCreator(@NonNull Context context) {
        super(context);
    }

    public void showSwitchDialog(Context context, String taskID, boolean isCoordinator, View.OnClickListener posButtonClickListener){
        final Dialog dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCancelable(false);

        dialog.setContentView(R.layout.dialog_switch_service);
        TextView task = dialog.findViewById(R.id.textView);
        TextView chooseOptionText = dialog.findViewById(R.id.textView2);
        Button cancelButton = dialog.findViewById(R.id.button);
        Button okButton = dialog.findViewById(R.id.button4);
        RadioButton redirect = dialog.findViewById(R.id.radioButton4);

        if(!isCoordinator) redirect.setVisibility(View.GONE);
        okButton.setOnClickListener(posButtonClickListener);

        task.setText("ID: " + taskID);
        chooseOptionText.setText("Choose option:");
        cancelButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
        dialog.show();

    }
}

Method call (dialog show):

DialogCreator dc = new DialogCreator(MainScreenActivity.this);
                dc.showSwitchDialog(MainScreenActivity.this, "000000", true,  new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        RadioButton radioAccept = v.findViewById(R.id.radioButton);
                        RadioButton radioDecline = v.findViewById(R.id.radioButton2);
                        RadioButton radioRedirect = v.findViewById(R.id.radioButton4);

                        if(radioAccept.isChecked()){
                            Toast.makeText(MainScreenActivity.this, "Accept", Toast.LENGTH_SHORT).show();
                        }
                        if(radioDecline.isChecked()){
                            Toast.makeText(MainScreenActivity.this, "Decline", Toast.LENGTH_SHORT).show();
                        }
                        if(radioRedirect.getVisibility() != View.GONE){
                            if (radioRedirect.isChecked()){
                                Toast.makeText(MainScreenActivity.this, "Redirect", Toast.LENGTH_SHORT).show();
                            }
                        }

                    }
                });

Everything seems to be fine (in my humble opinion) but I don't know if there is something wrong or missing or I can't just use Dialog this way. If this is right approach it would be great for me, because i could replace all Dialogs I have used before with my custom versions and that would make app a bit nicer, and clear.

SkypeDogg
  • 1,000
  • 2
  • 13
  • 28

2 Answers2

2

Well you can use DialogFragment for this.

DialogCreator.java

public class DialogCreator extends DialogFragment {

    private static final String TASK_ID_KEY = "taskID";
    private static final String COORDINATOR_KEY = "isCoordinator";

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setCancelable(false);
        setStyle(DialogFragment.STYLE_NORMAL, R.style.FullScreenDialogStyle);
    }

    public static DialogCreator newInstance(String taskID, boolean isCoordinator) {
        DialogCreator creator = new DialogCreator();
        Bundle bundle = new Bundle();
        bundle.putString(TASK_ID_KEY, taskID);
        bundle.putBoolean(COORDINATOR_KEY, isCoordinator);
        creator.setArguments(bundle);
        return creator;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.dialog, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        TextView task = view.findViewById(R.id.textView);
        TextView chooseOptionText = view.findViewById(R.id.textView2);
        Button cancelButton = view.findViewById(R.id.button);
        Button okButton = view.findViewById(R.id.button4);
        final RadioButton radioAccept = view.findViewById(R.id.radioButton);
        final RadioButton radioDecline = view.findViewById(R.id.radioButton2);

        final RadioButton redirect = view.findViewById(R.id.radioButton4);

        Bundle bundle = getArguments();
        if (bundle == null) return;
        if (!bundle.containsKey(TASK_ID_KEY) || !bundle.containsKey(COORDINATOR_KEY)) return;

        boolean isCoordinator = bundle.getBoolean(COORDINATOR_KEY);
        String taskID = bundle.getString(TASK_ID_KEY);
        if (!isCoordinator) redirect.setVisibility(View.GONE);

        task.setText("ID: " + taskID);
        chooseOptionText.setText("Choose option:");
        cancelButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
        okButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (radioAccept.isChecked()) {
                    Toast.makeText(requireContext(), "Accept", Toast.LENGTH_SHORT).show();
                }
                if (radioDecline.isChecked()) {
                    Toast.makeText(requireContext(), "Decline", Toast.LENGTH_SHORT).show();
                }
                if (redirect.getVisibility() != View.GONE) {
                    if (redirect.isChecked()) {
                        Toast.makeText(requireContext(), "Redirect", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        if (dialog.getWindow() != null) {
            dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        }
        return dialog;
    }
}

FullScreenDialogStyle in your styles.xml

<style name="FullScreenDialogStyle" parent="Theme.AppCompat.Dialog">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">false</item>
        <item name="android:windowIsFloating">false</item>
        <item name="android:windowBackground">@android:color/white</item>
</style>

In your activity:

DialogCreator.newInstance("taskID",true).show(getSupportFragmentManager(),"TAG")
Birju Vachhani
  • 6,072
  • 4
  • 21
  • 43
  • I thought I can make one `Class` to manage various Dialogs, but it looks like this one can do it with just one, correct me if I'm wrong – SkypeDogg Mar 11 '19 at 12:20
  • @SkypeDogg Yeah, you can create a base class `BaseDialogFragment` or use this one as base and then use it to create other dialogs with personalised configurations. It reduces boilerplate of setting styles and flags each time. – Birju Vachhani Mar 11 '19 at 13:04
  • Ok, thanks, but one more thing: functionality inside onClick method isn't just Toast or anything that I can do inside this class. It is outside and I need to "inject" this dialog to cooperate with existing code. The best way for me was to put `OnClickListener` as a parameter, but it gives me `NullPointerException`. Do you know maybe some workarround? – SkypeDogg Mar 11 '19 at 13:11
0

try to read this answer to understand how to create a dialog with a custom layout. You're using the function showSwitchDialog to create the dialog, but I think you should create the dialog from a class extending the Dialog class and then show it with something like:

CustomDialogClass cdd = new CustomDialogClass();
cdd.show();

from the link above. I tried to rewrite your layout file using a LinearLayout root tag, that may be the problem in showing the other views. If it doesn't solve the problem try to adjust the creation of the dialog as it shows in the above answer.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/dark_site_gray"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="16dp"
        app:srcCompat="@color/burgrundy" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="327dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
        android:gravity="center_horizontal"
        android:text="TextView"
        android:textColor="@color/mdtp_white"
        android:textSize="24sp" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
        android:gravity="center_horizontal"
        android:text="TextView"
        android:textColor="@color/mdtp_white"
        android:textSize="18sp" />

    <RadioButton
        android:id="@+id/radioButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="24dp"
        android:buttonTint="@color/mdtp_white"
        android:text="Akceptuj"
        android:textColor="@color/mdtp_white" />

    <RadioButton
        android:id="@+id/radioButton2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:buttonTint="@color/mdtp_white"
        android:text="Odrzuć"
        android:textColor="@color/mdtp_white" />

    <RadioButton
        android:id="@+id/radioButton4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:buttonTint="@color/mdtp_white"
        android:text="Przekaż dalej"
        android:textColor="@color/mdtp_white" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/button"
            android:layout_width="172dp"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_marginStart="8dp"
            android:layout_marginTop="12dp"
            android:background="@color/igloo_theme_color"
            android:text="Anuluj"
            android:textColor="@color/mdtp_white" />

        <Button
            android:id="@+id/button4"
            android:layout_width="172dp"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_marginStart="8dp"
            android:layout_marginTop="12dp"
            android:layout_marginEnd="8dp"
            android:background="@color/igloo_theme_color"
            android:text="OK"
            android:textColor="@color/mdtp_white" />
    </RelativeLayout>

</LinearLayout>

Hope it works!