Tôi có một Hoạt động được đặt tên whereActity
cũ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 đó?
Tôi có một Hoạt động được đặt tên whereActity
cũ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 đó?
Câu trả lời:
Để 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 activity
thẻ 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 Activity
sử 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.Dialog
thay thế.
@style/Theme.AppCompat.Dialog
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.
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
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">
@drawable/trans
: bạn sẽ có thể sử dụng @android:color/transparent
cái mà sẽ tạo ra ColorDrawable
để sử dụng làm nền.
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(...)
và 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)
<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
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>
<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.
<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>
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.
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
Đặ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);
Tạo hoạt động dưới dạng hộp thoại, Dưới đây là ví dụ đầy đủ
AndroidManife.xml
<activity android:name=".appview.settings.view.DialogActivity" android:excludeFromRecents="true" android:theme="@style/Theme.AppCompat.Dialog"/>
DialogActivity.kt
class DialogActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_dialog)
this.setFinishOnTouchOutside(true)
btnOk.setOnClickListener {
finish()
}
}
}
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>
Đô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 đó.