سؤال

انا املك DialogFragment لإظهار أ View مثل شاشة منبثقة.تظهر النافذة دائمًا في منتصف الشاشة.هل هناك طريقة لتحديد موقف DialogFragment نافذة او شباك؟لقد بحثت في مصدر الرمز ولكن لم أتمكن من العثور على أي شيء حتى الآن.

هل كانت مفيدة؟

المحلول

جرب شيئا مثل هذا:

giveacodicetagpre.

أو طرق أخرى للأجيال.

تأكد من تعيين الموضع بعد استدعاء محتوى المحتوى.

نصائح أخرى

حسنًا، لقد ضربت رأسي بالحائط لمدة ساعة أو ساعتين بهذا، قبل أن أتمكن أخيرًا من ذلك DialogFragment تم وضعه كما أردت.

أنا أبني على إجابة ستيلايت هنا.هذا هو النهج الأبسط والأكثر موثوقية الذي وجدته.

@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|Gravity.LEFT);

    // after that, setting values for x and y works "naturally"
    WindowManager.LayoutParams params = window.getAttributes();
    params.x = 300;
    params.y = 100;
    window.setAttributes(params);

    Log.d(TAG, String.format("Positioning DialogFragment to: x %d; y %d", params.x, params.y));
} 

لاحظ أن params.width و params.softInputMode (المستخدمة في إجابة Steelight) ليست ذات صلة بهذا.


فيما يلي مثال أكثر اكتمالا.ما كنت أحتاجه حقًا هو محاذاة DialogFragment "مربع التأكيد" بجوار عرض "المصدر" أو "الأصل"، في حالتي ImageButton.

لقد اخترت استخدام DialogFragment، بدلاً من أي جزء مخصص، لأنه يوفر لك ميزات "الحوار" مجانًا (إغلاق مربع الحوار عندما ينقر المستخدم خارجه، وما إلى ذلك).

Example ConfirmBox
مثال ConfirmBox أعلى ImageButton "المصدر" (سلة المهملات)

/**
 * 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() {
        if (source == null) {
            return; // Leave the dialog in default position
        }

        // Find out location of source component on screen
        // see https://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);
    }
}

من السهل جدًا جعل ما ورد أعلاه أكثر عمومية عن طريق إضافة معلمات مُنشئ أو أدوات ضبط حسب الضرورة.(نهائي بلدي ConfirmBox يحتوي على زر مصمم (داخل بعض الحدود وما إلى ذلك) نصه و View.OnClickListener يمكن تخصيصها في التعليمات البرمجية.)

getDialog().getWindow() لن تعمل ل DialogFragment مثل getWindow() سيعود فارغًا إذا لم يكن نشاط الاستضافة مرئيًا، وهو ليس كذلك إذا كنت تكتب تطبيقًا يستند إلى جزء.سوف تحصل على NullPointerException عندما تحاول getAttributes().

أوصي بإجابة موبيستري.إذا كان لديك بالفعل فئة DialogFragment، فليس من الصعب التبديل إليها.ما عليك سوى استبدال أسلوب onCreateDialog بطريقة تقوم بإنشاء نافذة PopupWindow وإرجاعها.ثم يجب أن تكون قادرًا على إعادة استخدام العرض الذي تقدمه له AlertDialog.builder.setView(), ، و اتصل (PopupWindow object).showAtLocation().

تحتاج إلى تجاوز طريقة OnResume () في الحوار الخاص بك مثل التالية:

giveacodicetagpre.

أنا أستخدم فئة Popupwindow لهذا الغرض لأنه يمكنك تحديد موقع وحجم العرض.

giveacodicetagpre.

انا استخدم AppCompatDialogFragment من android.support.v7.app.AppCompatDialogFragment وأريد محاذاة جزء الحوار إلى أسفل الشاشة وإزالة جميع الحدود أيضًا، خاصة أنني كنت بحاجة إلى ضبط عرض المحتوى ليطابق الأصل.

لذلك أردت من هذا (الخلفية الصفراء تأتي من تخطيط الجذر لجزء الحوار):

src_img_1

احصل على هذا:

src_img_2

لم ينجح أي من الحلول المذكورة أعلاه.لذلك، تمكنت من القيام بذلك:

fun AppCompatDialogFragment.alignToBottom() {
    dialog.window.apply {
        setGravity(Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL)
        decorView.apply {

            // Get screen width
            val displayMetrics = DisplayMetrics().apply {
                windowManager.defaultDisplay.getMetrics(this)
            }

            setBackgroundColor(Color.WHITE) // I don't know why it is required, without it background of rootView is ignored (is transparent even if set in xml/runtime)
            minimumWidth = displayMetrics.widthPixels
            setPadding(0, 0, 0, 0)
            layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)
            invalidate()
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top