package me.drakeet.materialdialog; import android.annotation.TargetApi; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.graphics.Color; import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; import android.os.Build; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; /** * Created by drakeet on 9/28/14. */ public class MaterialDialog { private final static int BUTTON_BOTTOM = 9; private final static int BUTTON_TOP = 9; private boolean mCancel; private Context mContext; private AlertDialog mAlertDialog; private MaterialDialog.Builder mBuilder; private View mView; private int mTitleResId; private CharSequence mTitle; private int mMessageResId; private CharSequence mMessage; private Button mPositiveButton; private LinearLayout.LayoutParams mLayoutParams; private Button mNegativeButton; private boolean mHasShow = false; private Drawable mBackgroundDrawable; private int mBackgroundResId; private View mMessageContentView; private DialogInterface.OnDismissListener mOnDismissListener; public MaterialDialog(Context context) { this.mContext = context; } public void show() { if (mHasShow == false) mBuilder = new Builder(); else mAlertDialog.show(); mHasShow = true; } public MaterialDialog setView(View view) { mView = view; if (mBuilder != null) { mBuilder.setView(view); } return this; } public MaterialDialog setContentView(View view) { mMessageContentView = view; if (mBuilder != null) { mBuilder.setContentView(mMessageContentView); } return this; } public MaterialDialog setBackground(Drawable drawable) { mBackgroundDrawable = drawable; if (mBuilder != null) { mBuilder.setBackground(mBackgroundDrawable); } return this; } public MaterialDialog setBackgroundResource(int resId) { mBackgroundResId = resId; if (mBuilder != null) { mBuilder.setBackgroundResource(mBackgroundResId); } return this; } public void dismiss() { mAlertDialog.dismiss(); } private int dip2px(float dpValue) { final float scale = mContext.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } private static boolean isLollipop() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; } public MaterialDialog setTitle(int resId) { mTitleResId = resId; if (mBuilder != null) { mBuilder.setTitle(resId); } return this; } public MaterialDialog setTitle(CharSequence title) { mTitle = title; if (mBuilder != null) { mBuilder.setTitle(title); } return this; } public MaterialDialog setMessage(int resId) { mMessageResId = resId; if (mBuilder != null) { mBuilder.setMessage(resId); } return this; } public MaterialDialog setMessage(CharSequence message) { mMessage = message; if (mBuilder != null) { mBuilder.setMessage(message); } return this; } public MaterialDialog setPositiveButton(int resId, final View.OnClickListener listener) { mPositiveButton = new Button(mContext); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT ); mPositiveButton.setLayoutParams(params); mPositiveButton.setBackgroundResource(R.drawable.button); mPositiveButton.setTextColor(Color.argb(255, 35, 159, 242)); mPositiveButton.setText(resId); mPositiveButton.setGravity(Gravity.CENTER); mPositiveButton.setTextSize(14); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT ); layoutParams.setMargins(dip2px(2), 0, dip2px(12), dip2px(BUTTON_BOTTOM)); mPositiveButton.setLayoutParams(layoutParams); mPositiveButton.setOnClickListener(listener); if (isLollipop()) { mPositiveButton.setBackgroundResource(android.R.color.transparent); } return this; } public MaterialDialog setPositiveButton(String text, final View.OnClickListener listener) { mPositiveButton = new Button(mContext); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT ); mPositiveButton.setLayoutParams(params); mPositiveButton.setBackgroundResource(R.drawable.button); mPositiveButton.setTextColor(Color.argb(255, 35, 159, 242)); mPositiveButton.setText(text); mPositiveButton.setGravity(Gravity.CENTER); mPositiveButton.setTextSize(14); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT ); layoutParams.setMargins(dip2px(2), 0, dip2px(12), dip2px(BUTTON_BOTTOM)); mPositiveButton.setLayoutParams(layoutParams); mPositiveButton.setOnClickListener(listener); if (isLollipop()) { mPositiveButton.setBackgroundResource(android.R.color.transparent); } return this; } public MaterialDialog setNegativeButton(int resId, final View.OnClickListener listener) { mNegativeButton = new Button(mContext); mLayoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT ); mNegativeButton.setLayoutParams(mLayoutParams); mNegativeButton.setBackgroundResource(R.drawable.button); mNegativeButton.setText(resId); mNegativeButton.setTextColor(Color.argb(222, 0, 0, 0)); mNegativeButton.setTextSize(14); mNegativeButton.setGravity(Gravity.CENTER); mNegativeButton.setOnClickListener(listener); if (isLollipop()) { mNegativeButton.setBackgroundResource(android.R.color.transparent); } return this; } public MaterialDialog setNegativeButton(String text, final View.OnClickListener listener) { mNegativeButton = new Button(mContext); mLayoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT ); mNegativeButton.setLayoutParams(mLayoutParams); mNegativeButton.setBackgroundResource(R.drawable.button); mNegativeButton.setText(text); mNegativeButton.setTextColor(Color.argb(222, 0, 0, 0)); mNegativeButton.setTextSize(14); mNegativeButton.setGravity(Gravity.CENTER); mNegativeButton.setOnClickListener(listener); if (isLollipop()) { mNegativeButton.setBackgroundResource(android.R.color.transparent); } return this; } public MaterialDialog setCanceledOnTouchOutside(boolean cancel) { this.mCancel = cancel; if (mBuilder != null) { mBuilder.setCanceledOnTouchOutside(mCancel); } return this; } public MaterialDialog setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) { this.mOnDismissListener = onDismissListener; return this; } private class Builder { private TextView mTitleView; private TextView mMessageView; private Window mAlertDialogWindow; private LinearLayout mButtonLayout; @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private Builder() { mAlertDialog = new AlertDialog.Builder(mContext).create(); mAlertDialog.show(); mAlertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); mAlertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); mAlertDialogWindow = mAlertDialog.getWindow(); View contv = LayoutInflater.from(mContext).inflate(R.layout.layout_materialdialog, null); contv.setFocusable(true); contv.setFocusableInTouchMode(true); mAlertDialogWindow.setBackgroundDrawableResource(R.drawable.material_dialog_window); mAlertDialogWindow.setContentView(contv); // mAlertDialogWindow.setContentView(R.layout.layout_materialdialog); //7 WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, PixelFormat.TRANSLUCENT ); mTitleView = (TextView) mAlertDialogWindow.findViewById(R.id.title); mMessageView = (TextView) mAlertDialogWindow.findViewById(R.id.message); mButtonLayout = (LinearLayout) mAlertDialogWindow.findViewById(R.id.buttonLayout); if (mView != null) { LinearLayout linearLayout = (LinearLayout) mAlertDialogWindow.findViewById(R.id.contentView); linearLayout.removeAllViews(); linearLayout.addView(mView); } if (mTitleResId != 0) { setTitle(mTitleResId); } if (mTitle != null) { setTitle(mTitle); } if (mTitle == null && mTitleResId == 0) { mTitleView.setVisibility(View.GONE); } if (mMessageResId != 0) { setMessage(mMessageResId); } if (mMessage != null) { setMessage(mMessage); } if (mPositiveButton != null) { mButtonLayout.addView(mPositiveButton); } if (mLayoutParams != null && mNegativeButton != null) { if (mButtonLayout.getChildCount() > 0) { mLayoutParams.setMargins(dip2px(12), 0, 0, dip2px(BUTTON_BOTTOM)); mNegativeButton.setLayoutParams(mLayoutParams); mButtonLayout.addView(mNegativeButton, 1); } else { mNegativeButton.setLayoutParams(mLayoutParams); mButtonLayout.addView(mNegativeButton); } } if (mBackgroundResId != 0) { LinearLayout linearLayout = (LinearLayout) mAlertDialogWindow.findViewById(R.id.material_background); linearLayout.setBackgroundResource(mBackgroundResId); } if (mBackgroundDrawable != null) { LinearLayout linearLayout = (LinearLayout) mAlertDialogWindow.findViewById(R.id.material_background); linearLayout.setBackground(mBackgroundDrawable); } if (mMessageContentView != null) { this.setContentView(mMessageContentView); } mAlertDialog.setCanceledOnTouchOutside(mCancel); if (mOnDismissListener != null) { mAlertDialog.setOnDismissListener(mOnDismissListener); } } public void setTitle(int resId) { mTitleView.setText(resId); } public void setTitle(CharSequence title) { mTitleView.setText(title); } public void setMessage(int resId) { mMessageView.setText(resId); } public void setMessage(CharSequence message) { mMessageView.setText(message); } /** * set positive button * * @param text the name of button * @param listener */ public void setPositiveButton(String text, final View.OnClickListener listener) { Button button = new Button(mContext); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); button.setLayoutParams(params); button.setBackgroundResource(R.drawable.material_card); button.setTextColor(Color.argb(255, 35, 159, 242)); button.setText(text); button.setGravity(Gravity.CENTER); button.setTextSize(14); button.setPadding(dip2px(12), 0, dip2px(32), dip2px(BUTTON_BOTTOM)); button.setOnClickListener(listener); mButtonLayout.addView(button); } /** * set negative button * * @param text the name of button * @param listener */ public void setNegativeButton(String text, final View.OnClickListener listener) { Button button = new Button(mContext); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); button.setLayoutParams(params); button.setBackgroundResource(R.drawable.material_card); button.setText(text); button.setTextColor(Color.argb(222, 0, 0, 0)); button.setTextSize(14); button.setGravity(Gravity.CENTER); button.setPadding(0, 0, 0, dip2px(8)); button.setOnClickListener(listener); if (mButtonLayout.getChildCount() > 0) { params.setMargins(20, 0, 10, dip2px(BUTTON_BOTTOM)); button.setLayoutParams(params); mButtonLayout.addView(button, 1); } else { button.setLayoutParams(params); mButtonLayout.addView(button); } } public void setView(View view) { LinearLayout l = (LinearLayout) mAlertDialogWindow.findViewById(R.id.contentView); l.removeAllViews(); ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); view.setLayoutParams(layoutParams); view.setOnFocusChangeListener( new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { System.out.println("-->" + hasFocus); mAlertDialogWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); // show imm InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput( InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY ); } } ); l.addView(view); if (view instanceof ViewGroup) { ViewGroup viewGroup = (ViewGroup) view; for (int i = 0; i < viewGroup.getChildCount(); i++) { if (viewGroup.getChildAt(i) instanceof EditText) { EditText editText = (EditText) viewGroup.getChildAt(i); editText.setFocusable(true); editText.requestFocus(); editText.setFocusableInTouchMode(true); } } for (int i = 0; i < viewGroup.getChildCount(); i++) { if (viewGroup.getChildAt(i) instanceof AutoCompleteTextView) { AutoCompleteTextView autoCompleteTextView = (AutoCompleteTextView) viewGroup.getChildAt(i); autoCompleteTextView.setFocusable(true); autoCompleteTextView.requestFocus(); autoCompleteTextView.setFocusableInTouchMode(true); } } } } public void setContentView(View contentView) { ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); contentView.setLayoutParams(layoutParams); if (contentView instanceof ListView) { setListViewHeightBasedOnChildren((ListView) contentView); } LinearLayout linearLayout = (LinearLayout) mAlertDialogWindow.findViewById(R.id.message_content_view); if (linearLayout != null) { linearLayout.removeAllViews(); linearLayout.addView(contentView); } for (int i = 0; i < linearLayout.getChildCount(); i++) { if (linearLayout.getChildAt(i) instanceof AutoCompleteTextView) { AutoCompleteTextView autoCompleteTextView = (AutoCompleteTextView) linearLayout.getChildAt(i); autoCompleteTextView.setFocusable(true); autoCompleteTextView.requestFocus(); autoCompleteTextView.setFocusableInTouchMode(true); } } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public void setBackground(Drawable drawable) { LinearLayout linearLayout = (LinearLayout) mAlertDialogWindow.findViewById(R.id.material_background); linearLayout.setBackground(drawable); } public void setBackgroundResource(int resId) { LinearLayout linearLayout = (LinearLayout) mAlertDialogWindow.findViewById(R.id.material_background); linearLayout.setBackgroundResource(resId); } public void setCanceledOnTouchOutside(boolean canceledOnTouchOutside) { mAlertDialog.setCanceledOnTouchOutside(canceledOnTouchOutside); } } /** * 动态测量listview-Item的高度 * @param listView */ public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { // pre-condition return; } int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); } }