【问题标题】:DialogFragment without FragmentActivity没有 FragmentActivity 的 DialogFragment
【发布时间】:2013-06-24 23:57:04
【问题描述】:

在使用Activity 而不是FragmentActivity 时,是否可以使用DialogFragmentshow() 方法需要 FragmentManager

我想实现一个只包含一个EditText 的对话框,Android 开发人员的教程说我必须在对话框片段上使用自定义布局。所以我问,因为我不想改变使用FragmentActivity 只是为了 1 个对话。

已解决: 我决定只使用FragmentActivity 而不是Activity,所以它不会变得更复杂。

【问题讨论】:

  • 请编辑您的问题,因为它不够清楚。您是否尝试通过扩展 Activity 类来实现您的 DialogFragment?
  • 不,我试图在扩展 Activity 的自定义类上使用 DialogFragment。教程说自定义类应该扩展 FragmentActivity 而不是 Activity。所以我在问我是否可以扩展 Activity。
  • 你试过吗?遇到什么问题了吗?

标签: android android-activity dialogfragment


【解决方案1】:

我遇到了同样的问题。我知道你在一年前问过这个问题,但仍然是为了帮助其他用户。这就是我解决问题的方法。

public void show_dialog() {
    FragmentManager fm = getFragmentManager();
    DialogFragment newFragment = new DialogFragment();
    newFragment.show(fm, "abc");
}

这只需要 FragmentManager 导入,而不是 FragmentActivity。

【讨论】:

  • 如果您使用的是 V7 支持库,则需要调用“getSupportFragmentManager()”。非常感谢!
  • 注意!它需要最低 API 级别 11
【解决方案2】:

可能有点晚了,但我也遇到了从非 FragmentActivity 调用 DialogFragment 的问题。同样将其设置为 FragmentActivity 只是为了一个简单的对话框是没有意义的。所以对我来说,解决方案是制作一个带有回调无效的接口,以在活动中获取 DialogFragment 响应。对我来说,最好在对话框调用附近获得响应,而不是在 onActivityResult 覆盖中的某个地方获得响应。

界面:

   import android.os.Parcelable;

/**
 * Created by TH on 03.11.2015.
 */
public interface OnDialogResponseListener extends Parcelable {

    void onDialogResponse(int responseCode);

}

通用对话框类:

import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;

/**
 * Code basisc found here:
     *   http://stackoverflow.com/questions/7977392/android-dialogfragment-vs-dialog
* changed by TH on 03.11.2015.
     */
public class YesNoDialog extends DialogFragment
{

    public static final String TITLE="title";
    public static final String MESSAGE="message";
    public static final String LISTENER="listener";
    public static final String YES="yes";
    public static final String NO="no";
    public static final String ICON_ID="icon_id";
    private OnDialogResponseListener mResponseListener;

    public YesNoDialog()
    {

    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        Bundle args = getArguments();
        String title = args.getString(TITLE, "");
        String message = args.getString(MESSAGE, "");
        String yes = args.getString(YES, "");
        String no = args.getString(NO, "");
        int iconID=args.getInt(ICON_ID);
        mResponseListener=args.getParcelable(LISTENER);

        return new AlertDialog.Builder(getActivity())
                .setTitle(title)
                .setMessage(message)
                .setIcon(iconID)
                .setPositiveButton(yes, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (mResponseListener != null) {
                            mResponseListener.onDialogResponse(Activity.RESULT_OK);
                        }

                    }
                })
                .setNegativeButton(no, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (mResponseListener != null) {
                            mResponseListener.onDialogResponse(Activity.RESULT_CANCELED);
                        }
                    }
                })
                .create();
    }
}

而用法是这样的:

OnDialogResponseListener onDialogResponseListener=new OnDialogResponseListener() {


                @Override
                public int describeContents() {
                    return 0; //Leave this as it is
                }

                @Override
                public void writeToParcel(Parcel dest, int flags) {
                        //Leave this as it is
                }

                @Override
                public void onDialogResponse(int responseCode) {


                    //Do what you want with your dialog answers

                    if(responseCode== Activity.RESULT_OK){
                        Toast.makeText(MovementActivity.this,"OK pressed",Toast.LENGTH_LONG).show();
                    }else if(responseCode==Activity.RESULT_CANCELED){
                        Toast.makeText(MovementActivity.this,"CANCEL pressed",Toast.LENGTH_LONG).show();
                    }

                }
            };


            YesNoDialog dialog = new YesNoDialog();
            Bundle args = new Bundle();
            args.putInt(YesNoDialog.ICON_ID, R.drawable.ic_action_add_light);
            args.putString(YesNoDialog.YES, getString(R.string.action_add));
            args.putString(YesNoDialog.NO, getString(R.string.action_cancel));
            args.putString(YesNoDialog.TITLE, getString(R.string.dialog_title_add_item));
            args.putString(YesNoDialog.MESSAGE, getString(R.string.dialog_message_add_item));
            args.putParcelable(YesNoDialog.LISTENER, onDialogResponseListener);
            dialog.setArguments(args);
            dialog.show(getSupportFragmentManager(), "tag");

就是这样。可能比简单对话框中的代码多一点,但它保持其值并在方向更改时显示。这就是我使用 DialogFragment 的目标。

【讨论】:

    【解决方案3】:

    非常非常简单,只需使用getSupportFragmentManager()

    DialogConfirmRequest dialogConfirmRequest = new DialogConfirmRequest("Sem conexão com a internet");
    dialogConfirmRequest.setCancelable(true);
    dialogConfirmRequest.show(getSupportFragmentManager() ,"meudialog");
    

    【讨论】:

    • 自 2021 年起,应该是这个,而不是接受的答案 - getFragmentManager() 不再有效。
    【解决方案4】:

    如果您需要所有片段的总体对话框,只需将普通的dialog code 用于带有片段活动的活动。否则,只需在 DialogFragment 中实现它作为 Fragment Activity 的子项。

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题,但在下面链接的堆栈溢出帖子中的答案的帮助下设法解决了它。我特别喜欢 mrolcsi 的解决方案,其中包含正/负结果侦听器概念,据我所知,它给出了非常简洁的结果。

      Get value from DialogFragment

      【讨论】:

        【解决方案6】:

        对于 Kotlin

        YourDialog().show(activity?.supportFragmentManager!!, "Message")
        

        【讨论】:

          猜你喜欢
          • 2014-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多