从片段显示对话框?

我有一些需要显示常规对话框的片段。 在这些对话框中,用户可以select是/否的答案,然后片段应该相应的行为。

现在, Fragment类没有一个onCreateDialog()方法来覆盖,所以我想我必须在包含Activity外部实现对话框。 没关系,但Activity需要以某种方式向选定的答案报告片段。 我当然可以在这里使用一个callback模式,所以这个片段在一个监听器类的Activity上注册自己,Activity会通过这个回报答案,或者类似的东西。

但是,对于一个简单的任务来说,这似乎是一个相当大的混乱,因为在片段中显示“简单的”是 – 否对话框。 而且,这样我的Fragment就不会自给自足了。

有没有更干净的方法来做到这一点?

编辑:

这个问题的答案并没有真正解释如何使用DialogFragments从碎片显示对话框。 所以AFAIK,要走的路是:

  1. 显示片段。
  2. 在需要的时候,实例化一个DialogFragment。
  3. 使用.setTargetFragment()将原始片段设置为此DialogFragment的目标。
  4. 用原始片段的.show()显示DialogFragment。
  5. 当用户在这个DialogFragment上select一些选项时,通知原始片段有关这个select(例如,用户点击'是'),你可以用.getTarget()获得原始片段的引用。
  6. closuresDialogFragment。

你应该改用DialogFragment 。

我必须谨慎地怀疑以前接受的答案,即使用DialogFragment是最好的select。 DialogFragment的目的(主要)目的似乎是显示本身对话框的片段, 不是显示具有要显示的对话框的片段。

我相信使用片段的活动来调解对话框和片段之间是更好的select。

下面是一个yes / no DialogFragment的完整例子:

class上:

 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,并使用它来代替embedded式侦听器。

callback到活动

如果你想实现callback这是如何完成在你的活动:

 YourActivity extends Activity implements OnFragmentClickListener 

 @Override public void onFragmentClick(int action, Object object) { switch(action) { case SOME_ACTION: //Do your action here break; } } 

callback类:

 public interface OnFragmentClickListener { public void onFragmentClick(int action, Object object); } 

然后从一个片段执行一个callback,你需要确保这个监听器是这样附加的:

 @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mListener = (OnFragmentClickListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement listeners!"); } } 

而callback是这样执行的:

 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所示,我只是想不出一种方法来解决尽pipe说wrap_content底部button的高度被削减了一半,所以我添加了一个隐藏的button,而不是一半“剪”。 对不起,黑客。

  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托pipe一个片段。 我想要一个对话框出现在布局的顶部,要求用户input,然后相应地处理input。 看一个截图

这是我的片段的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"); }