Конечно, вы можете использовать Dialog.setContentView (), чтобы установить содержимое диалога в качестве произвольного макета.
Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.yourLayoutId);
dialog.show();
Создайте файл макета с необходимыми компонентами и вызовите setContentView в диалоговом окне, передав имя файла макета.
Если в AlertDialog у вас тупик, вы можете сделать что-то похожее с builder.setView ()
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.yourLayoutId, (ViewGroup) findViewById(R.id.yourLayoutRoot));
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setView(layout);
AlertDialog alertDialog = builder.create();
alertDialog.show();