Created
March 7, 2014 02:56
-
-
Save ishitcno1/9404496 to your computer and use it in GitHub Desktop.
A custom DialogFragment that is positioned above given "source" component. Ref: http://stackoverflow.com/questions/9698410/position-of-dialogfragment-in-android
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* A custom DialogFragment that is positioned above given "source" component. | |
* | |
* @author Jonik, http://stackoverflow.com/a/20419231/56285 | |
*/ | |
public class ConfirmBox extends DialogFragment { | |
private View source; | |
public ConfirmBox() { | |
} | |
public ConfirmBox(View source) { | |
this.source = source; | |
} | |
public static ConfirmBox newInstance(View source) { | |
return new ConfirmBox(source); | |
} | |
@Override | |
public void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setStyle(STYLE_NO_FRAME, R.style.Dialog); | |
} | |
@Override | |
public void onStart() { | |
super.onStart(); | |
// Less dimmed background; see http://stackoverflow.com/q/13822842/56285 | |
Window window = getDialog().getWindow(); | |
WindowManager.LayoutParams params = window.getAttributes(); | |
params.dimAmount = 0.2f; // dim only a little bit | |
window.setAttributes(params); | |
// Transparent background; see http://stackoverflow.com/q/15007272/56285 | |
// (Needed to make dialog's alpha shadow look good) | |
window.setBackgroundDrawableResource(android.R.color.transparent); | |
} | |
@Override | |
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { | |
// Put your dialog layout in R.layout.view_confirm_box | |
View view = inflater.inflate(R.layout.view_confirm_box, container, false); | |
// Initialise what you need; set e.g. button texts and listeners, etc. | |
// ... | |
setDialogPosition(); | |
return view; | |
} | |
/** | |
* Try to position this dialog next to "source" view | |
*/ | |
private void setDialogPosition() { | |
if (source == null) { | |
return; // Leave the dialog in default position | |
} | |
// Find out location of source component on screen | |
// see http://stackoverflow.com/a/6798093/56285 | |
int[] location = new int[2]; | |
source.getLocationOnScreen(location); | |
int sourceX = location[0]; | |
int sourceY = location[1]; | |
Window window = getDialog().getWindow(); | |
// set "origin" to top left corner | |
window.setGravity(Gravity.TOP|Gravity.LEFT); | |
WindowManager.LayoutParams params = window.getAttributes(); | |
// Just an example; edit to suit your needs. | |
params.x = sourceX - dpToPx(110); // about half of confirm button size left of source view | |
params.y = sourceY - dpToPx(80); // above source view | |
window.setAttributes(params); | |
} | |
public int dpToPx(float valueInDp) { | |
DisplayMetrics metrics = getActivity().getResources().getDisplayMetrics(); | |
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment