package com.example.dialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.BottomSheetBehavior; import android.support.design.widget.BottomSheetDialog; import android.support.design.widget.BottomSheetDialogFragment; import android.support.v4.app.DialogFragment; import android.view.LayoutInflater; import android.view.View; import android.widget.EditText; import com.example.R; public class SheetDialogFragment extends BottomSheetDialogFragment { private static final String ARGUMENT_EXAMPLE = "example"; private String mExample; private View mRootView; private BottomSheetBehavior mBehavior; private String mUsername = ""; private String mPassword = ""; private SheetDialogListener mListener; public interface SheetDialogListener { void onSheetDialogStateChanged(DialogFragment dialog, int newState, String username, String password); void onSheetDialogDismiss(DialogFragment dialog, String username, String password); } public static SheetDialogFragment newInstance(String example) { SheetDialogFragment fragment = new SheetDialogFragment(); // arguments Bundle arguments = new Bundle(); arguments.putString(ARGUMENT_EXAMPLE, example); fragment.setArguments(arguments); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCancelable(true); setRetainInstance(true); // handle fragment arguments Bundle arguments = getArguments(); if(arguments != null) { handleArguments(arguments); } // set callback listener try { mListener = (SheetDialogListener) getTargetFragment(); } catch(ClassCastException e) { throw new ClassCastException(getTargetFragment().toString() + " must implement " + SheetDialogListener.class.getName()); } } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // cancelable on touch outside if(getDialog() != null) getDialog().setCanceledOnTouchOutside(true); // restore saved state handleSavedInstanceState(); } @Override public void onDestroyView() { // http://code.google.com/p/android/issues/detail?id=17423 if(getDialog() != null && getRetainInstance()) getDialog().setDismissMessage(null); super.onDestroyView(); } @Override public void onSaveInstanceState(Bundle outState) { // save current instance state super.onSaveInstanceState(outState); EditText usernameEditText = (EditText) mRootView.findViewById(R.id.dialog_custom_username); EditText passwordEditText = (EditText) mRootView.findViewById(R.id.dialog_custom_password); mUsername = usernameEditText.getText().toString(); mPassword = passwordEditText.getText().toString(); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // inflate layout LayoutInflater inflater = getActivity().getLayoutInflater(); mRootView = inflater.inflate(R.layout.dialog_custom, null); // create dialog final BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState); dialog.setContentView(mRootView); // set arguments EditText usernameEditText = (EditText) mRootView.findViewById(R.id.dialog_custom_username); usernameEditText.setHint(mExample); // setup behavior mBehavior = BottomSheetBehavior.from((View) mRootView.getParent()); mBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { @Override public void onStateChanged(@NonNull View bottomSheet, int newState) { EditText usernameEditText = (EditText) mRootView.findViewById(R.id.dialog_custom_username); EditText passwordEditText = (EditText) mRootView.findViewById(R.id.dialog_custom_password); String username = usernameEditText.getText().toString(); String password = passwordEditText.getText().toString(); // TODO: data validation mListener.onSheetDialogStateChanged(SheetDialogFragment.this, newState, username, password); if(newState == BottomSheetBehavior.STATE_HIDDEN) dialog.dismiss(); } @Override public void onSlide(@NonNull View bottomSheet, float slideOffset) { // do nothing } }); return dialog; } @Override public void onDismiss(DialogInterface dialog) { EditText usernameEditText = (EditText) mRootView.findViewById(R.id.dialog_custom_username); EditText passwordEditText = (EditText) mRootView.findViewById(R.id.dialog_custom_password); String username = usernameEditText.getText().toString(); String password = passwordEditText.getText().toString(); // TODO: data validation mListener.onSheetDialogDismiss(SheetDialogFragment.this, username, password); // destroy dialog fragment if(getFragmentManager() != null) { getFragmentManager().beginTransaction().remove(this).commitAllowingStateLoss(); } } private void handleArguments(Bundle arguments) { if(arguments.containsKey(ARGUMENT_EXAMPLE)) { mExample = (String) arguments.get(ARGUMENT_EXAMPLE); } } private void handleSavedInstanceState() { EditText usernameEditText = (EditText) mRootView.findViewById(R.id.dialog_custom_username); EditText passwordEditText = (EditText) mRootView.findViewById(R.id.dialog_custom_password); usernameEditText.setText(mUsername); passwordEditText.setText(mPassword); } }