Hoạt động của Android dưới dạng hộp thoại


257

Tôi có một Hoạt động được đặt tên whereActitycũng có các hộp thoại con. Bây giờ, tôi muốn hiển thị hoạt động này dưới dạng hộp thoại cho hoạt động khác.

Làm thế nào tôi có thể làm điều đó?

nhập mô tả hình ảnh ở đây


Nếu bạn chỉ muốn tải hộp thoại, bạn có thể sử dụng ProgressDialog
Daksh Agrawal

Câu trả lời:


546

Để bắt đầu hoạt động như hộp thoại, tôi đã định nghĩa nó như thế này trong AndroidManifest.xml:

<activity android:theme="@android:style/Theme.Dialog" />

Sử dụng thuộc tính này trong activitythẻ của bạn để tránh Hộp thoại của bạn xuất hiện trong danh sách ứng dụng được sử dụng gần đây

android:excludeFromRecents="true"

Nếu bạn muốn ngăn hộp thoại / hoạt động của mình bị hủy khi người dùng nhấp bên ngoài hộp thoại:

Sau khi setContentView()vào bạn Activitysử dụng:

this.setFinishOnTouchOutside(false);

Bây giờ khi tôi gọi startActivity()nó sẽ hiển thị dưới dạng một hộp thoại, với hoạt động trước đó được hiển thị khi người dùng nhấn nút quay lại.

Lưu ý rằng nếu bạn đang sử dụng ActionBarActivity(hoặc chủ đề AppCompat), bạn sẽ cần sử dụng @style/Theme.AppCompat.Dialogthay thế.


186
Sử dụng android: theme = "@ android: style / Theme.Dialog" là cách để sử dụng nhưng đừng quên sử dụng ElimFromRecents = true nếu không hộp thoại của bạn sẽ xuất hiện trong Ứng dụng được sử dụng gần đây (giữ phím Home).
Emmanuel

7
tôi gặp khó khăn liên quan đến hoạt động như hộp thoại .. tôi đã thực hiện hoạt động dưới dạng hộp thoại nhưng vấn đề là khi tôi nhấp vào bên ngoài hoạt động thì nó tự động bị đóng .. ??? Có giải pháp nào liên quan đến việc này không .. ??????
Wolverine

7
@Emmanuel, nó phải là android: ElimFromRecents = "true" lưu ý các trích dẫn kép
Sandeep

43
Lưu ý rằng nếu bạn đang sử dụng ActionBarActivity (hoặc chủ đề AppCompat), bạn sẽ cần sử dụng@style/Theme.AppCompat.Dialog
Quentin Klein

8
@Wolverine, Thêm phương thức this.setFinishOnTouchOutside(false);sau setContentView()để ngăn hoạt động bị hủy khi bạn nhấp bên ngoài hộp thoại bạn đã tạo.
Anggrayudi H

43

Sử dụng mã này để hoạt động hộp thoại sẽ không bị đóng khi người dùng chạm vào bên ngoài hộp thoại:

this.setFinishOnTouchOutside(false);

yêu cầu API cấp 11


1
Có giải pháp nào cho API <11 không?
PK Gupta

@pkgupta, nếu bạn chấp nhận được, bạn không nên lo lắng ít nhất API <15 cho tôi vì dù sao cũng không có nhiều người sử dụng các phiên bản trước đó. Trên thực tế, tính đến năm 2017, tôi nghĩ 19 hoặc 20 là minSDK mới.
Chiến tranh neon

28

Bạn có thể xác định kiểu này trong các giá trị / style.xml để thực hiện một Splash trước đây:

   <style name="Theme.UserDialog" parent="android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowBackground">@drawable/trans</item>
    </style>

Và sử dụng nó AndroidManifest.xml:

   <activity android:name=".SplashActivity"
          android:configChanges="orientation"
          android:screenOrientation="sensor"
          android:theme="@style/Theme.UserDialog">

2
re @drawable/trans: bạn sẽ có thể sử dụng @android:color/transparentcái mà sẽ tạo ra ColorDrawableđể sử dụng làm nền.
TWiStErRob

1
<item name = "android: windowBackground"> ​​@ null </ item> là một lựa chọn khác
TouchBoarder

Vấn đề là hoạt động đang lấp đầy toàn bộ màn hình nhưng không hiển thị dưới dạng lớp phủ hộp thoại.
Shajeel Afzal

Đó là <item name="windowNoTitle">true</item> (không có "android"). Xem tại đây . Không chắc chắn về các mặt hàng khác.
Gary99

23

1 - Bạn có thể sử dụng cùng một hoạt động với cả hộp thoại và toàn màn hình:

Gọi setTheme(android.R.style.Theme_Dialog)trước khi gọi setContentView(...)super.oncreate()trong Hoạt động của bạn.

2 - Nếu bạn không có kế hoạch thay đổi phong cách chủ đề hoạt động, bạn có thể sử dụng

<activity android:theme="@android:style/Theme.Dialog" />

(như được đề cập bởi @faisal khan)


Chỉ cần một lưu ý: khi tôi sử dụng phương thức lập trình (phương thức đầu tiên), mọi thứ phía sau hộp thoại sẽ bị bôi đen hoàn toàn; đây không phải là một vấn đề trong phương pháp khác Quá tệ ... Tôi thực sự muốn làm điều đó bằng lập trình .... Nexus 5, Android 6.0.1
Eric

@Eric bạn đã tìm ra giải pháp cho bôi đen ??
anand

1
@anand có, kết hợp cả hai giải pháp lại với nhau để khắc phục sự cố mất điện: đặt chủ đề hoạt động thành chủ đề hộp thoại trong tệp kê khai android ( <activity android:theme="@android:style/Theme.Dialog" />) và lập trình chủ đề hoạt động thành hộp thoại hoặc hoạt động trong onCreate stackoverflow.com/a/35915764/2898715
Eric

21

Nếu bạn cần phiên bản Appcompat

style.xml

    <!-- Base application theme. -->
    <style name="AppDialogTheme" parent="Theme.AppCompat.Light.Dialog">
        <!-- Customize your theme here. -->
        <item name="windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
    </style>

yourmanifest.xml

    <activity
          android:name=".MyActivity"
          android:label="@string/title"
          android:theme="@style/AppDialogTheme">
    </activity>

Điều đó thật tuyệt. Tôi cần phải loại bỏ thanh hành động. Tôi đã phải sửa đổi XML một chút mặc dù. Tôi đã phải thêm <item name="windowNoTitle">true</item>để làm cho nó hoạt động cho tôi. Tôi cũng thêm vào <item name="android:windowActionBar">false</item>cho các biện pháp tốt.
Eric

5
Ngoài ra đối với tôi <item name="android:windowNoTitle">true</item>đã không làm việc (Android 5.0.1), và tôi đã phải thay đổi để<item name="windowNoTitle">true</item>
Noti

17

Nếu hoạt động của bạn đang được hiển thị dưới dạng hộp thoại, chỉ cần thêm một nút vào xml hoạt động của bạn,

<Button
    android:id="@+id/close_button"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Dismiss" />

Sau đó đính kèm một trình nghe nhấp chuột trong mã Java của Activity. Trong người nghe, chỉ cần gọifinish()

Button close_button = (Button) findViewById(R.id.close_button);
close_button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        finish();
    }
});

Điều đó sẽ bỏ qua hộp thoại của bạn, đưa bạn trở lại hoạt động gọi điện.


8

Nếu bạn muốn xóa tiêu đề hoạt động & cung cấp chế độ xem tùy chỉnh cho hộp thoại, hãy thêm phần sau vào khối hoạt động của bảng kê khai của bạn

android:theme="@style/Base.Theme.AppCompat.Dialog"

và thiết kế Activity_layout của bạn với chế độ xem mong muốn của bạn


2

Đặt chủ đề trong tệp kê khai Android của bạn.

<activity android:name=".LoginActivity"
            android:theme="@android:style/Theme.Dialog"/>

Và đặt trạng thái hộp thoại khi chạm để kết thúc.

this.setFinishOnTouchOutside(false);

1

Tạo hoạt động dưới dạng hộp thoại, Dưới đây là ví dụ đầy đủ

nhập mô tả hình ảnh ở đây

  1. AndroidManife.xml

    <activity android:name=".appview.settings.view.DialogActivity" android:excludeFromRecents="true" android:theme="@style/Theme.AppCompat.Dialog"/>

  2. DialogActivity.kt

    class DialogActivity : AppCompatActivity() {
      override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_dialog)
        this.setFinishOnTouchOutside(true)
    
        btnOk.setOnClickListener {
          finish()
        }
      }
    }
  3. Activity_dialog.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#0072ff"
    android:gravity="center"
    android:orientation="vertical">
    
    <LinearLayout
        android:layout_width="@dimen/_300sdp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/txtTitle"
            style="@style/normal16Style"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:paddingTop="20dp"
            android:paddingBottom="20dp"
            android:text="Download"
            android:textColorHint="#FFF" />
    
        <View
            android:id="@+id/viewDivider"
            android:layout_width="match_parent"
            android:layout_height="2dp"
            android:background="#fff"
            android:backgroundTint="@color/white_90"
            app:layout_constraintBottom_toBottomOf="@id/txtTitle" />
    
        <TextView
            style="@style/normal14Style"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:paddingTop="20dp"
            android:paddingBottom="20dp"
            android:text="Your file is download"
            android:textColorHint="#FFF" />
    
    
        <Button
            android:id="@+id/btnOk"
            style="@style/normal12Style"
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:layout_marginBottom="20dp"
            android:background="@drawable/circle_corner_layout"
            android:text="Ok"
            android:textAllCaps="false" />
        </LinearLayout>
    
      </LinearLayout>

Vui lòng không sử dụng phông chữ x lớn để làm cho câu trả lời của bạn trông lạ.
CopsOnRoad

0

Đôi khi bạn có thể nhận được Ngoại lệ được đưa ra dưới đây

Nguyên nhân bởi: java.lang.IllegalStateException: Bạn cần sử dụng một chủ đề Theme.AppCompat (hoặc hậu duệ) với hoạt động này.

Vì vậy, để giải quyết bạn có thể sử dụng giải pháp đơn giản

thêm chủ đề của hoạt động của bạn trong tệp kê khai dưới dạng hộp thoại cho appCompact.

android:theme="@style/Theme.AppCompat.Dialog"

Nó có thể hữu ích cho ai đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.