Показать диалог из фрагмента?
у меня есть некоторые фрагменты, которые должны показать обычный диалог. В этих диалогах пользователь может выбрать ответ Да / нет, а затем фрагмент должен вести себя соответственно.
и Fragment класс не имеет onCreateDialog() метод для переопределения, поэтому я думаю, что я должен реализовать диалоги снаружи, в содержании Activity. Это нормально, но тогда Activity необходимо каким-то образом сообщить выбранный ответ фрагменту. Я мог бы конечно использовать шаблон обратного вызова, так что фрагмент регистрирует себя на Activity С классом слушателя, и активность будет сообщать ответ через это или что-то в этом роде.
но это, кажется, довольно большой беспорядок для простой задачи, как отображение "простой" да-нет Диалог во фрагменте. Кроме того, этот путь мой Fragment будет менее самодостаточным.
есть ли какой-то более чистый способ сделать это?
Edit:
ответ на этот вопрос на самом деле не объясняет подробно, как для отображения диалогов из фрагментов следует использовать DialogFragments. Итак, АФАИК, путь таков:
- отображение фрагмента.
- при необходимости создайте экземпляр DialogFragment.
- установите исходный фрагмент в качестве цели этого DialogFragment, с
.setTargetFragment(). - показать DialogFragment с .показать() из исходного фрагмента.
- когда пользователь выбирает какой-либо параметр на этом DialogFragment, уведомить исходный фрагмент об этом выбор (например, пользователь нажал "да"), вы можете получить ссылку на оригинальный фрагмент .getTarget().
- отклонить DialogFragment.
7 ответов:
вы должны использовать DialogFragment вместо.
Я должен осторожно сомневаться в ранее принятом ответе, что использование DialogFragment является лучшим вариантом. Предполагаемая (основная) цель DialogFragment, по-видимому, заключается в отображении фрагментов, которые are диалоги сами по себе, а не для отображения фрагментов, которые есть диалоговые окна для отображения.
Я считаю, что использование активности фрагмента для посредничества между диалогом и фрагментом является предпочтительным вариантом.
вот полный пример Yes / no DialogFragment:
класс:
public class SomeDialog extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setTitle("Title") .setMessage("Sure you wanna do this!") .setNegativeButton(android.R.string.no, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // do nothing (will close dialog) } }) .setPositiveButton(android.R.string.yes, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // do something } }) .create(); } }начать диалог:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); // Create and show the dialog. SomeDialog newFragment = new SomeDialog (); newFragment.show(ft, "dialog");вы также можете позволить классу реализовать onClickListener и использовать его вместо встроенных слушателей.
обратный вызов активности
если вы хотите реализовать обратный вызов, это, как это делается В вашей деятельности:
YourActivity extends Activity implements OnFragmentClickListenerи
@Override public void onFragmentClick(int action, Object object) { switch(action) { case SOME_ACTION: //Do your action here break; } }обратный вызов класс:
public interface OnFragmentClickListener { public void onFragmentClick(int action, Object object); }затем для выполнения обратного вызова из фрагмента вам нужно убедиться, что слушатель прикреплен следующим образом:
@Override public void onAttach(Activity activity) { super.onAttach(activity); try { mListener = (OnFragmentClickListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement listeners!"); } }и обратный вызов выполняется так:
mListener.onFragmentClick(SOME_ACTION, null); // null or some important object as second parameter.
для меня это было следующее -
MyFragment:
public class MyFragment extends Fragment implements MyDialog.Callback { ShowDialog activity_showDialog; @Override public void onAttach(Activity activity) { super.onAttach(activity); try { activity_showDialog = (ShowDialog)activity; } catch(ClassCastException e) { Log.e(this.getClass().getSimpleName(), "ShowDialog interface needs to be implemented by Activity.", e); throw e; } } @Override public void onClick(View view) { ... MyDialog dialog = new MyDialog(); dialog.setTargetFragment(this, 1); //request code activity_showDialog.showDialog(dialog); ... } @Override public void accept() { //accept } @Override public void decline() { //decline } @Override public void cancel() { //cancel } }MyDialog:
public class MyDialog extends DialogFragment implements View.OnClickListener { private EditText mEditText; private Button acceptButton; private Button rejectButton; private Button cancelButton; public static interface Callback { public void accept(); public void decline(); public void cancel(); } public MyDialog() { // Empty constructor required for DialogFragment } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.dialogfragment, container); acceptButton = (Button) view.findViewById(R.id.dialogfragment_acceptbtn); rejectButton = (Button) view.findViewById(R.id.dialogfragment_rejectbtn); cancelButton = (Button) view.findViewById(R.id.dialogfragment_cancelbtn); acceptButton.setOnClickListener(this); rejectButton.setOnClickListener(this); cancelButton.setOnClickListener(this); getDialog().setTitle(R.string.dialog_title); return view; } @Override public void onClick(View v) { Callback callback = null; try { callback = (Callback) getTargetFragment(); } catch (ClassCastException e) { Log.e(this.getClass().getSimpleName(), "Callback of this class must be implemented by target fragment!", e); throw e; } if (callback != null) { if (v == acceptButton) { callback.accept(); this.dismiss(); } else if (v == rejectButton) { callback.decline(); this.dismiss(); } else if (v == cancelButton) { callback.cancel(); this.dismiss(); } } } }действие:
public class MyActivity extends ActionBarActivity implements ShowDialog { .. @Override public void showDialog(DialogFragment dialogFragment) { FragmentManager fragmentManager = getSupportFragmentManager(); dialogFragment.show(fragmentManager, "dialog"); } }макет DialogFragment:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="vertical" > <TextView android:id="@+id/dialogfragment_textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:layout_centerHorizontal="true" android:layout_marginBottom="10dp" android:text="@string/example"/> <Button android:id="@+id/dialogfragment_acceptbtn" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:layout_centerHorizontal="true" android:layout_below="@+id/dialogfragment_textview" android:text="@string/accept" /> <Button android:id="@+id/dialogfragment_rejectbtn" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_alignLeft="@+id/dialogfragment_acceptbtn" android:layout_below="@+id/dialogfragment_acceptbtn" android:text="@string/decline" /> <Button android:id="@+id/dialogfragment_cancelbtn" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_marginBottom="20dp" android:layout_alignLeft="@+id/dialogfragment_rejectbtn" android:layout_below="@+id/dialogfragment_rejectbtn" android:text="@string/cancel" /> <Button android:id="@+id/dialogfragment_heightfixhiddenbtn" android:layout_width="200dp" android:layout_height="20dp" android:layout_marginTop="10dp" android:layout_marginBottom="20dp" android:layout_alignLeft="@+id/dialogfragment_cancelbtn" android:layout_below="@+id/dialogfragment_cancelbtn" android:background="@android:color/transparent" android:enabled="false" android:text=" " /> </RelativeLayout>название
dialogfragment_heightfixhiddenbtnпоказывает, я просто не мог понять, как исправить, что высота нижней кнопки была разрезана пополам, несмотря на то, что сказалwrap_content, поэтому я добавил скрытую кнопку, чтобы" разрезать " пополам вместо этого. Извините за взлом.
public void showAlert(){ AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); View alertDialogView = inflater.inflate(R.layout.test_dialog, null); alertDialog.setView(alertDialogView); TextView textDialog = (TextView) alertDialogView.findViewById(R.id.text_testDialogMsg); textDialog.setText(questionMissing); alertDialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); alertDialog.show(); }где .test_dialog в формате XML на заказ
Я сам Новичок, и я честно не мог найти удовлетворительного ответа, который я мог бы понять или реализовать.
Так вот внешняя ссылка, что я действительно помог мне достичь того, что я хотел. Это очень прямо вперед, и легко следовать, а также.
http://www.helloandroid.com/tutorials/how-display-custom-dialog-your-android-application
ЭТО ТО, ЧТО Я ПЫТАЛСЯ ДОСТИЧЬ С ПОМОЩЬЮ КОДА:
У меня есть MainActivity, который хосты фрагмент. Я хотел, чтобы диалоговое окно появилось поверх макета, чтобы запросить ввод пользователя, а затем обработать ввод соответственно. посмотреть скриншот
вот что выглядит onCreateView моего фрагмента
@Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_home_activity, container, false); Button addTransactionBtn = rootView.findViewById(R.id.addTransactionBtn); addTransactionBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Dialog dialog = new Dialog(getActivity()); dialog.setContentView(R.layout.dialog_trans); dialog.setTitle("Add an Expense"); dialog.setCancelable(true); dialog.show(); } });Я надеюсь, что это поможет вам
Дайте мне знать, если есть какой-либо путаницы. :)
public static void OpenDialog (Activity activity, DialogFragment fragment){ final FragmentManager fm = ((FragmentActivity)activity).getSupportFragmentManager(); fragment.show(fm, "tag"); }
Comments