Saltar al contenido

Posición de DialogFragment en Android

El paso a paso o código que hallarás en este artículo es la resolución más rápida y válida que hallamos a tu duda o dilema.

Solución:

Prueba algo como esto:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    getDialog().getWindow().setGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP);
    WindowManager.LayoutParams p = getDialog().getWindow().getAttributes();
    p.width = ViewGroup.LayoutParams.MATCH_PARENT;
    p.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE;
    p.x = 200;
    ...
    getDialog().getWindow().setAttributes(p);
    ...

u otros métodos para getDialog().getWindow().

asegúrese de establecer la posición después de llamar a set-content.

Correcto, me golpeé la cabeza contra la pared durante una o dos horas con esto, antes de finalmente obtener DialogFragment colocado como yo quería.

Estoy construyendo sobre la respuesta de Steelight aquí. Este es el enfoque más simple y confiable que encontré.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle b) 
    Window window = getDialog().getWindow();

    // set "origin" to top left corner, so to speak
    window.setGravity(Gravity.TOP 

Tenga en cuenta que params.width y params.softInputMode (usado en la respuesta de Steelight) son irrelevantes para esto.


A continuación se muestra un ejemplo más completo. Lo que realmente necesitaba era alinear un “cuadro de confirmación” DialogFragment junto a una vista “fuente” o “principal”, en mi caso un ImageButton.

Elegí usar DialogFragment, en lugar de cualquier Fragmento personalizado, porque le brinda funciones de “diálogo” de forma gratuita (cerrar el diálogo cuando el usuario hace clic fuera de él, etc.).

Ejemplo ConfirmBox


Ejemplo ConfirmBox encima de su “fuente” ImageButton (papelera)

/**
 * A custom DialogFragment that is positioned above given "source" component.
 *
 * @author Jonik, https://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 https://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 https://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() 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);
    

Es bastante fácil hacer que lo anterior sea de uso más general agregando parámetros constructores o configuradores según sea necesario. (Mi final ConfirmBox tiene un botón con estilo (dentro de algunos bordes, etc.) cuyo texto y View.OnClickListener se puede personalizar en código.)

Debe anular el método onResume() en su DialogFragment de la siguiente manera:

@Override
public void onResume() 
    final Window dialogWindow = getDialog().getWindow();
    WindowManager.LayoutParams lp = dialogWindow.getAttributes();
    lp.x = 100;        // set your X position here
    lp.y = 200;        // set your Y position here
    dialogWindow.setAttributes(lp);

    super.onResume();

Eres capaz de añadir valor a nuestra información tributando tu experiencia en las notas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *