Intereting Posts
Как проверить, включен ли Android «Мобильные данные» Каково определение ценности, предоставляемой функцией Android View.getHitRect ()? Android AVD Manager: невозможно создать новое определение устройства (java.lang.NullPointerException) Android: беззаботное воспроизведение зацикленного аудиофайла в MediaPlayer Android gradle uploadArchives при создании Fake KeyEvent не работает * точно * как «реальная» кнопка. Зачем? MapView в фрагменте (соты) Не удается найти класс символов в Android Studio Инструмент разработчика для разработки базы данных SQLite для Android Как создать сертификат для моего Android Market APK? Zero-width, разбивающее пространство для Android Отображение карты Google на эмуляторе Как подключить Lenovo IdeaPad S6000 к Windows 7 (64-разрядная версия) Отладка в Android-устройстве через Wi-Fi без использования root Измените данные пакета намерений до того, как активность будет восстановлена ​​после изменения ориентации

Добавление положительной / отрицательной кнопки в диалог DialogFragment

Привет, я уже написал DialogFragment. Теперь я понял, что хочу, чтобы у него была положительная и отрицательная кнопка, как AlertDialog. Как я могу достичь такого, сохраняя код, который я написал?

public class DoublePlayerChooser extends DialogFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NORMAL,0); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setTitle("title") .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // do something... } } ) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); } } ) .create(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.doubleplayerchooser, container, false); getDialog().setTitle("Enter Players"); firstPlayerPicker = (ImageButton) v.findViewById(R.id.imageButton1); firstPlayerPicker.setOnClickListener(new OnClickListener() { public void onClick(final View v){ callContactPicker(1); } }); secondPlayerPicker = (ImageButton) v.findViewById(R.id.ImageButton01); secondPlayerPicker.setOnClickListener(new OnClickListener() { public void onClick(final View v){ callContactPicker(2); } }); loadFromFile = (ImageButton) v.findViewById(R.id.imageButton2); loadFromFile.setOnClickListener(new OnClickListener() { public void onClick(final View v){ } }); firstTextfield = (EditText) v.findViewById(R.id.editText1); secondTextfield = (EditText) v.findViewById(R.id.EditText01); firstImage = (ImageView) v.findViewById(R.id.imageView1); secondImage = (ImageView) v.findViewById(R.id.ImageView01); return v; } 

Solutions Collecting From Web of "Добавление положительной / отрицательной кнопки в диалог DialogFragment"

Хорошо, вот как я понял это. Я удалил onCreateView и изменил onCreateDialog, на самом деле эта ссылка получила ответ, поэтому все кредиты должны идти туда. Я только что разместил его на всякий случай, если кто-то столкнется в этой теме сначала

  @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder b= new AlertDialog.Builder(getActivity()) .setTitle("Enter Players") .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // do something... } } ) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); } } ); LayoutInflater i = getActivity().getLayoutInflater(); View v = i.inflate(R.layout.doubleplayerchooser,null); firstPlayerPicker = (ImageButton) v.findViewById(R.id.imageButton1); firstPlayerPicker.setOnClickListener(new OnClickListener() { public void onClick(final View v){ callContactPicker(1); } }); secondPlayerPicker = (ImageButton) v.findViewById(R.id.ImageButton01); secondPlayerPicker.setOnClickListener(new OnClickListener() { public void onClick(final View v){ callContactPicker(2); } }); loadFromFile = (ImageButton) v.findViewById(R.id.imageButton2); loadFromFile.setOnClickListener(new OnClickListener() { public void onClick(final View v){ } }); firstTextfield = (EditText) v.findViewById(R.id.editText1); secondTextfield = (EditText) v.findViewById(R.id.EditText01); firstImage = (ImageView) v.findViewById(R.id.imageView1); secondImage = (ImageView) v.findViewById(R.id.ImageView01); b.setView(v); return b.create(); } 

Вы должны переопределить метод DialogFragments onCreateDialog (…):

 @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setTitle("title") .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // do something... } } ) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); } } ) .create(); } 

Взято отсюда: Android: отключить кнопки DialogFragment OK / Cancel

Согласно сообщению об ошибке, которое вы получаете («функция запроса должна быть вызвана …») Я бы рекомендовал:

Не вызывайте setContentView () перед requestFeature () в своей деятельности или там, где вы его вызываете.

Более того:

Не называть setStyle (…) внутри onCreate ().

Назовите это, когда вы создадите свой фрагмент.

 YourDialogFragment f = new YourDialogFragment(Context); f.setStyle(...); // and so on ... 

Чтобы добавить кнопки действий, вызовите setPositiveButton() и setNegativeButton() :

 public class FireMissilesDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the Builder class for convenient dialog construction AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage(R.string.dialog_fire_missiles) .setPositiveButton(R.string.fire, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // FIRE ZE MISSILES! } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // User cancelled the dialog } }); // Create the AlertDialog object and return it return builder.create(); } } 

Подробнее о DialogFragment здесь .

Самый ясный способ.

 // Your own onCreate_Dialog_View method public View onCreateDialogView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.your_layout, container); // inflate here } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // do something with 'view' } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // setup dialog: buttons, title etc AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity()) .setTitle(R.string.dialog_fragment_author_title) .setNegativeButton(R.string.dialog_fragment_author_close, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); } } ); // call default fragment methods and set view for dialog View view = onCreateDialogView(getActivity().getLayoutInflater(), null, null); onViewCreated(view, null); dialogBuilder.setView(view); return dialogBuilder.create(); } 

Это немного onCreateView но в последнее время я переопределял onCreateView при расширении AppCompatDialogFragment . Просто разместите свои собственные кнопки в том же макете, который вы onCreateView в onCreateView – используйте стили, такие как @style/Widget.AppCompat.Button.Borderless .

Вы получаете дополнительный бонус от контроля отклонения Dialog при нажатии кнопки действия, тем более, что у этих пользовательских представлений иногда требуются входные данные, и вы хотите заблокировать автоматическое закрытие диалогового окна при нажатии кнопки.

Использование пользовательского представления в onCreateDialog всегда считалось грязным, потому что вы раздуваете его без контейнера. Google попытался сделать API немного лучше с новым методом v7 AlertDialog.Builder setView(int layoutResId) , но тогда вы не можете вызвать findViewById .

Вы должны добавить такую ​​тему в свои стили.xml:

 <style name="AlertDialog" parent="Theme.AppCompat.Light.Dialog.Alert"> <item name="colorPrimary">@color/material_light_blue_500</item> <item name="colorPrimaryDark">@color/material_light_blue_800</item> <item name="colorAccent">@color/material_light_blue_a400</item> <item name="colorButtonNormal">@color/material_light_blue_500</item> <item name="colorControlNormal">@color/material_light_blue_600</item> <item name="colorControlActivated">@color/material_light_blue_a100</item> <item name="colorControlHighlight">@color/material_light_blue_a100</item> </style> 

Вы должны переопределить onCreateDialog в вашем DialogFragment, чтобы вернуть new AppCompatDialog(getActivity(), R.style.AlertDialog) .