package com.lq.fragment; import java.lang.reflect.Field; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.util.Log; import android.view.LayoutInflater; import android.widget.EditText; import android.widget.Toast; import com.lq.xpressmusic.R; /** * @author lq 2013-6-1 lq2625304@gmail.com * */ public class EditTextDialogFragment extends DialogFragment { /** 自定义的对话框里的文本输入监听器 */ public interface OnMyDialogInputListener { /** * 用户点击确定按钮时调用此方法 * * @param newListName * 輸入的文本框中的内容 */ public abstract void onEditTextInputCompleted(String newListName); } private static final String TAG = EditTextDialogFragment.class .getSimpleName(); private static final String TITLE = "title"; private static final String CONTENT = "content"; private static final String HINT = "hint"; private EditText mView_et_PlaylistName = null; private OnMyDialogInputListener mListener = null; private AlertDialog mAlertDialog = null; /** * 产生一个EditTextDialogFragment实例 * * @param title * 对话框的标题 * @param content * 文本输入框预置内容 * @param hint * 文本输入框提示信息 * @param listner * OnMyDialogInputListener实例,以接受输入事件的变化 * */ public static EditTextDialogFragment newInstance(String title, String content, String hint, OnMyDialogInputListener listner) { EditTextDialogFragment f = new EditTextDialogFragment(); f.setOnPlaylistCreateListener(listner); Bundle args = new Bundle(); args.putString(TITLE, title); args.putString(CONTENT, content); args.putString(HINT, hint); f.setArguments(args); return f; } public void setOnPlaylistCreateListener(OnMyDialogInputListener l) { mListener = l; } @Override public void onCreate(Bundle savedInstanceState) { Log.i(TAG, "onCreate"); super.onCreate(savedInstanceState); mView_et_PlaylistName = (EditText) LayoutInflater.from(getActivity()) .inflate(R.layout.edittext_dialog, null); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Log.i(TAG, "onCreateDialog"); String title = ""; String content = ""; String hint = ""; if (getArguments() != null) { title = getArguments().getString(TITLE); content = getArguments().getString(CONTENT); hint = getArguments().getString(HINT); } mView_et_PlaylistName.setText(content); mView_et_PlaylistName.setHint(hint); if (content != null) { mView_et_PlaylistName.setSelection(content.length()); } mAlertDialog = new AlertDialog.Builder(getActivity()).setTitle(title) .setView(mView_et_PlaylistName) .setPositiveButton(R.string.confirm, mPositiveClickListener) .setNegativeButton(R.string.cancel, mNegativeClickListener) .create(); return mAlertDialog; } @Override public void onDestroy() { Log.i(TAG, "onDestroy"); super.onDestroy(); mListener = null; mAlertDialog = null; } /** * 利用反射将父类mShowing变量设为false,表示对话框已关闭,父类不会再因为按了按钮而关闭对话框 * * @param isShown * true表示点击按钮时对话框不会关闭,false为点击按钮对话框会关闭 */ private void setWindowShownWhenClickedButton(boolean isShown) { try { Field field = mAlertDialog.getClass().getSuperclass() .getDeclaredField("mShowing"); field.setAccessible(true); // 将mShowing变量设为false,表示对话框已关闭 field.set(mAlertDialog, !isShown); } catch (Exception e) { } } public void setDialogDismiss() { setWindowShownWhenClickedButton(false); dismiss(); } public void setDialogStayShown() { setWindowShownWhenClickedButton(true); } private DialogInterface.OnClickListener mPositiveClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (mView_et_PlaylistName.getText().toString().equals("")) { // 如果输入框为空,提示输入 Toast.makeText(getActivity(), getActivity().getString(R.string.input_playlist_name), Toast.LENGTH_SHORT).show(); setWindowShownWhenClickedButton(true); } else if (mListener != null) { Log.i(TAG, "确定--->传递文本给监听器"); // 返回EditText中输入的内容 mListener.onEditTextInputCompleted(mView_et_PlaylistName .getText().toString()); } } }; private DialogInterface.OnClickListener mNegativeClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { setDialogDismiss(); } }; }