سؤال

هل هناك أي طريقة لإظهار مربع حوار غير معدني-مربع حوار يسمح للمستخدم بالتفاعل مع كل ما كان على الشاشة قبل مربع الحوار ولكنه يسمح أيضًا للمستخدم بالتفاعل مع مربع الحوار إذا تم الضغط عليه؟

أعرف الخبز المحمص ، لكنهم لا يسمحون بالتفاعل مع المنبثقة.

أعرف الحوارات ، لكنها مشروطة ولا تسمح بالتفاعل مع الخلفية.

أعرف الإخطارات ، لكني أريد شيئًا على الشاشة.

أريد أساسًا أن أكون قادرًا على لعب لعبة أو شيء من هذا القبيل ويبدو أن المنبثقة يظهر أن لدي رسالة بريد إلكتروني جديدة أو شيء من هذا القبيل. يمكنني النقر عليه لعرض بريدي الإلكتروني ، لكن يمكنني الانتظار حتى تختفي إذا أردت فقط الاستمرار في لعب لعبتي. هل هذا ممكن في Android؟

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

المحلول

نعم ، قم بإنشاء نشاط بأسلوب Theme.Dialog. هذا نشاط طبيعي يبدو وكأنه مربع حوار ، في حين كونه غير معدّل وقبول الأحداث.

مثال:

<activity android:name=".activity.dialog.PhotoDialog"
          android:label="@string/photo_dialog_title"
          android:theme="@android:style/Theme.Dialog"/>

تحرير:

في الواقع Theme.Dialog تطمس النشاط الأساسي ويجعله غير ممكن. كان لدي متطلبات مماثلة هنا كان عليّ إظهار مربع حوار التحديث مع النص وزر الإلغاء. الصيد الرئيسي في الإعداد WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL وإعادة ضبط WindowManager.LayoutParams.FLAG_DIM_BEHIND.

إنشاء مربع حوار مع محتوى مخصص:

    if (progressDialog == null) {
            progressDialog = new Dialog(activityRequestingProgressDialog);
            progressDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            progressDialog.setContentView(R.layout.progress_upload);
            progressBar = (ProgressBar) progressDialog.findViewById(R.id.progressBar);
            progressText = (TextView) progressDialog.findViewById(R.id.progressText);
            progressText.setText("0 %");
            progressText.setTextSize(18);
            Button buttonCancel = (Button) progressDialog.findViewById(R.id.btnCancel);
            buttonCancel.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view) {
                    cancelProgressDialog();
                    stopUpload("Upload cancelled.");
                }
            });
            Window window = progressDialog.getWindow();
            window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
                    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
            window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
            window.setGravity(Gravity.BOTTOM);
            progressDialog.show();
        }

        progressText.setText(text);
        progressBar.setProgress(percent);

وهذا هو التصميم لهذا الحوار:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/progressDialog"
          android:orientation="vertical"
          android:layout_height="wrap_content"
          android:layout_width="wrap_content"
          android:layout_centerVertical="true">

<TextView android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_gravity="center"
          android:textSize="18sp"
          android:padding="10dp"
          android:text="@string/progress_title"/>

<LinearLayout android:id="@+id/progressDialog"
              android:orientation="horizontal"
              android:layout_height="wrap_content"
              android:layout_width="wrap_content"
              android:padding="10dp"
              android:layout_centerVertical="true">

    <ProgressBar android:id="@+id/progressBar"
                 android:layout_width="150dp"
                 android:layout_height="34dp"
                 android:paddingRight="10dp"
                 android:max="100"
                 android:progress="0"
                 android:fadingEdge="vertical"
                 style="?android:attr/progressBarStyleHorizontal"/>

    <TextView android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center"
              android:id="@+id/progressText"
              android:paddingRight="10dp"/>

    <Button android:layout_height="40dp"
            android:layout_width="80dp"
            android:id="@+id/btnCancel"
            android:text="@string/dialog_cancel"/>

</LinearLayout>
</LinearLayout>

نصائح أخرى

فقط اضف flag_not_touch_modal العلم إلى الحوار الخاص بك

dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);  

تنفيذي الذي كان أكثر انتشارًا قليلاً ولكنه يسمح أيضًا بالمساحة بالزر عن طريق نافذة الخلفية

_wm = this.getWindowManager();
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
_view = layoutInflater.inflate(R.layout.notification, null);

_params = new WindowManager.LayoutParams();
_params.height = android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
_params.width = android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
_params.flags = 
    // this is to keep button presses going to the background window
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
    // this is to enable the notification to recieve touch events
    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
// background transparant
_params.format = PixelFormat.TRANSLUCENT;
_gravity = Gravity.TOP;//Gravity.BOTTOM;

_wm.addView(_view, _params);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top