nền
Các Activity
đằng sau một Acivity
được rút ra nếu chủ đề hoạt động foreground của theo AndroidManifest.xml
của nó là một hộp thoại; nếu không hệ điều hành android sẽ không vẽ Activity
đằng sau nó (có thể để tiết kiệm bộ nhớ vì nó thường sẽ không được nhìn thấy anyway).
Để khai thác điều này, chúng tôi đặt chủ đề của Acitvity
thành hộp thoại trong tệp kê khai, làm cho hệ điều hành android vẽ Activity
đằng sau nó, nhưng sau đó, lập trình chủ đề của chúng tôi theo bất kỳ điều gì chúng tôi thích khi chạy.
Tutorial
Bước 1: tạo ra hai chủ đề tùy chỉnh cho ứng dụng của bạn trong styles.xml
. Một cho hoạt động bình thường, và một cho hoạt động thoại. Điều quan trọng là chủ đề hộp thoại tùy chỉnh kế thừa từ một chủ đề cơ bản cũng là một hộp thoại. Trong trường hợp của tôi, chủ đề gốc là Base.Theme.AppCompat.Light.Dialog.FixedSize
). Đây là tôi styles.xml
:
<resources>
<!-- custom normal activity theme -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
</style>
<!-- custom dialog activity theme -->
<style name="AppTheme.Dialog" parent="Base.Theme.AppCompat.Light.Dialog.FixedSize">
<!-- removing the dialog's action bar -->
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
</resources>
Bước 2: trong AndroidManifest.xml
, thiết lập các chủ đề của Activity
trong câu hỏi cho bất kỳ chủ đề hộp thoại. Điều này làm cho hệ điều hành Android nghĩ rằng Activity
là một hộp thoại, vì vậy nó sẽ vẽ Activity
đằng sau nó, và không phải màu đen nó ra. Trong trường hợp của tôi, tôi đã sử dụng Theme.AppCompat.Dialog
. Dưới đây là tôi AndroidManifest.xml
:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.eric.questiondialog_artifact">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name">
<activity
android:name=".DialogActivity"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.Dialog"> <-- IMPORTANT!!! -->
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
Bước 3: trong hoạt động thực tế, thiết lập các chủ đề programatically hoặc là chủ đề cho các hoạt động bình thường, hoặc các chủ đề cho các hộp thoại.DialogActivity.java
của tôi là dưới đây:
package com.example.eric.questiondialog_artifact;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
public class DialogActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
setTheme(R.style.AppTheme_Dialog); // can either use R.style.AppTheme_Dialog or R.style.AppTheme as deined in styles.xml
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
}
}
Có thể trùng lặp: http://stackoverflow.com/questions/1979369/android-activity-as-a-dialog. Có thể bạn cũng có thể quan tâm đến điều này: https://github.com/pingpongboss/StandOut –
@NguyenDoanTung cảm ơn bạn. Tôi cũng thấy bài viết đó, nhưng hầu hết các câu trả lời đó liên quan đến việc sửa đổi 'AndroidManifest.xml' mà tôi không muốn làm. Tôi đã thử phương pháp đầu tiên được đề cập trong http://stackoverflow.com/a/22216966/2898715, nhưng nó không tạo ra kết quả khả quan như đã đề cập trong câu hỏi của tôi. Ngoài ra, cảm ơn bạn đã liên kết github, tôi đã kiểm tra nó ra, tuy nhiên tôi thực sự hy vọng có một giải pháp đơn giản hơn. – Eric