Làm cách nào để tạo một Hoạt động minh bạch trên Android?


915

Tôi muốn tạo một Hoạt động minh bạch trên đầu trang của một hoạt động khác.

Làm thế nào tôi có thể đạt được điều này?

Câu trả lời:


1393

Thêm kiểu sau vào res/values/styles.xmltệp của bạn (nếu bạn không có, hãy tạo nó.) Đây là một tệp hoàn chỉnh:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
  </style>
</resources>

(Giá trị @color/transparentlà giá trị màu #00000000mà tôi đặt trong res/values/color.xmltệp. Bạn cũng có thể sử dụng @android:color/transparenttrong các phiên bản Android mới hơn.)

Sau đó, áp dụng kiểu cho hoạt động của bạn, ví dụ:

<activity android:name=".SampleActivity" android:theme="@style/Theme.Transparent">
...
</activity>

13
Tôi đã sử dụng<item name="android:windowBackground">@android:color/transparent</item>
Ai đó ở đâu đó

33
Tuyệt quá! Chỉ cần một cải tiến: Nếu bạn sử dụng Parent = "@ android: style / Theme.Dialog", bạn sẽ có được hành vi chính xác của một hộp thoại. Điều đó có nghĩa là mờ dần vào / ra thay vì trượt vào / ra (như một hoạt động)
PakitoV

73
Như @Emilio đã đề cập, điều này sẽ hoạt động giống như một hộp thoại, chủ yếu là do android:windowIsFloatingđược đặt thành đúng. Xóa thuộc tính này để hoạt động như một hoạt động bình thường (trong trường hợp này nó sẽ khớp android:style/Theme.Translucent.NoTitleBar)
aromero

38
Tôi đã xóa <item name = "android: windowIsFloating"> true </ item> để có một hoạt động toàn màn hình & minh bạch
Kiêm Dương

12
Hoạt động của tôi được bắt nguồn từ AppCompatActivity. Vì vậy, parent="android:Theme"đã sụp đổ ứng dụng của tôi. Tôi chỉ cần loại bỏ nó và nó làm việc như quyến rũ. Cảm ơn!
Atul

193

Nó như thế này:

<activity android:name=".usual.activity.Declaration" android:theme="@android:style/Theme.Translucent.NoTitleBar" />

3
Bạn chỉ cần thêm chủ đề như alex đã đăng vào khai báo hoạt động của bạn trong tệp kê khai - bit android này: theme = "@ android: style / Theme.Translucent.NoTitleBar, với mỗi Hoạt động bạn có thể gán cho nó chủ đề mờ
Donal Rafferty

12
@UMMA: Sử dụng một dấu hỏi thường là đủ. Nhiều dấu hỏi khiến những người dành thời gian trả lời câu hỏi của bạn nghĩ rằng bạn đang nhảy vào mặt họ.
Matthias

7
@Matthias họ thường là như vậy, bởi vì ông chủ của họ đang nhảy vào cuộc của họ
Reno

16
@ người dùng1129443 : 50% black should be #7f000000. Mỗi thành phần (A, R, G, B) có thể lấy giá trị từ 0-255. 50% of 255 = 127. 127 in Hex = 7FĐó là cách tính độ trong suốt (độ mờ đục)
Nam Trung

4
Phương thức này khóa UI khi hoạt động đang chạy nhưng vì nó được đặt thành mờ, Người ta không thể làm gì. Có cách nào để tránh khóa UI này.
Akhil Latta

126

Trong tệp kiểu tệp:

<style name="Theme.AppCompat.Translucent" parent="Theme.AppCompat.NoActionBar">
    <item name="android:background">#33000000</item> <!-- Or any transparency or color you need -->
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation</item>
</style>

Trong AndroidManifest.xml:

<activity
    android:name=".WhateverNameOfTheActivityIs"
    android:theme="@style/Theme.AppCompat.Translucent">
    ...
</activity>

1
Nếu bạn đang dự định thực sự hiển thị một cái gì đó trên Hoạt động này (giả sử Hộp thoại hoặc Hộp thoại), bạn sẽ nhận thấy rằng mọi thứ đều có chủ đề Tối. Vì vậy, bạn có thể muốn chủ đề của bạn kế thừa từ Theme.Appcompat.Light.NoActionBarthay thế.
tir38

1
trong trường hợp của tôi, nó hiển thị nền đen. Tôi có chủ đề gốc đặt một cái gì đó khác nhưng trên một hoạt động cụ thể tôi đang thay đổi chủ đề như đã đề cập. Có ai giúp đỡ không?
Abdul Waheed

4
Hoạt động tuyệt vời khi tôi xóa "android: nền"
Oded Breiner

2
tôi nghĩ rằng bạn muốn loại bỏ backgroundvà đưa màu bán trong suốt ưa thích của bạn vàowindowBackground
hmac

Đây sẽ là câu trả lời nếu hoạt động của bạn đang sử dụng AppCompatActivity trái ngược với câu trả lời của @ gnobal.
AeroEchelon

37

Khai báo hoạt động của bạn trong bảng kê khai như thế này:

 <activity   
     android:name=".yourActivity"    
     android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>

Và thêm một nền trong suốt để bố trí của bạn.


Cách tốt nhất. Cảm ơn
Peter

5
Bạn cần sử dụng một chủ đề Theme.AppCompat (hoặc hậu duệ) với hoạt động này.
Puni

28

Chỉ định chủ đề mờ cho hoạt động mà bạn muốn minh bạch trong tệp kê khai Android của dự án của bạn:

<activity
    android:name="YOUR COMPLETE ACTIVITY NAME WITH PACKAGE"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />

16

Tôi muốn thêm vào điều này một chút vì tôi cũng là một nhà phát triển Android mới. Câu trả lời được chấp nhận là rất tốt, nhưng tôi đã gặp phải một số rắc rối. Tôi không chắc chắn làm thế nào để thêm màu vào tệp colors.xml. Đây là cách nó nên được thực hiện:

màu sắc

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <color name="class_zero_background">#7f040000</color>
     <color name="transparent">#00000000</color>
</resources>

Trong tệp colors.xml gốc của tôi, tôi có thẻ "drawable":

<drawable name="class_zero_background">#7f040000</drawable>

Và vì vậy tôi cũng đã làm điều đó cho màu sắc, nhưng tôi không hiểu rằng tham chiếu "@ color /" có nghĩa là tìm kiếm thẻ "màu" trong XML. Tôi nghĩ rằng tôi cũng nên đề cập đến điều này để giúp đỡ bất cứ ai khác.


16

Tôi đã đạt được nó trên 2.3.3 bằng cách chỉ cần thêm android:theme="@android:style/Theme.Translucent"vào thẻ hoạt động trong tệp kê khai.

Tôi không biết về các phiên bản thấp hơn ...


Điều này cũng hoạt động tốt cho 2.2. Tôi chỉ tạo ra một hoạt động đơn giản với một listview và nó nổi lên trên hoạt động cuối cùng.
slott

Nó đã được thêm vào API 1, đó không phải là vấn đề :)
xmen

6
Không sử dụng AppCompatActivitynếu bạn đang sử dụng này.
zackygaurav

hoạt động trong 7.0 cũng vì vậy cách tiếp cận tốt của nó. Tôi đã sửa đổi nó thành @android: style / Theme.Translucent.NoTitleBar.Fullscreen
Sandeep

16

Trong trường hợp của tôi, tôi phải đặt chủ đề cho thời gian chạy trong java dựa trên một số điều kiện. Vì vậy, tôi đã tạo một chủ đề theo phong cách (tương tự như các câu trả lời khác):

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
  </style>
</resources>

Sau đó, trong Java tôi đã áp dụng nó vào hoạt động của mình:

@Override
protected void onCreate(Bundle savedInstanceState) {

    String email = getIntent().getStringExtra(AppConstants.REGISTER_EMAIL_INTENT_KEY);
    if (email != null && !email.isEmpty()) {
        // We have the valid email ID, no need to take it from user,
        // prepare transparent activity just to perform bg tasks required for login
        setTheme(R.style.Theme_Transparent);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

    } else
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_dummy);
}

Hãy nhớ một điểm quan trọng ở đây: Bạn phải gọi setTheme()hàm trước super.onCreate(savedInstanceState);. Tôi đã bỏ lỡ điểm này và bị mắc kẹt trong 2 giờ, suy nghĩ tại sao chủ đề của tôi không được phản ánh trong thời gian chạy.


9

Trong hàm onCreate , bên dưới setContentView , thêm dòng này:

getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

23
Làm cho nền hoàn toàn ĐEN vì một số lý do.
Subin Sebastian

Của tôi cũng vậy @SubinSebastian, có ai tìm được cách khắc phục không?
finnmreb

8

Chỉ cần để hình ảnh hoạt động nền trong suốt. Hoặc thêm chủ đề trong tệp XML:

<activity android:name=".usual.activity.Declaration" android:theme="@android:style/Theme.Translucent.NoTitleBar" />

7

Cách dễ nhất mà tôi đã tìm thấy là đặt chủ đề của hoạt động trong AndroidManifest thành android:theme="@android:style/Theme.Holo.Dialog" .

Sau đó, trong phương thức onCreate của hoạt động, hãy gọi getWindow().setBackgroundDrawable(new ColorDrawable(0));.


6

Đối với hoạt động hộp thoại, tôi sử dụng:

getWindow().getDecorView().setBackgroundResource(android.R.color.transparent);

Nhưng bạn cũng cần đặt Chế độ xem chính của mình trong hoạt động thành vô hình. Nếu không, nền sẽ vô hình trong khi tất cả các chế độ xem trong đó sẽ hiển thị.


2
Làm cho nền hoàn toàn ĐEN
ucMedia

5

Ngoài các câu trả lời trên:

để tránh sự cố liên quan đến Android Oreo trên hoạt động

<style name="AppTheme.Transparent" parent="@style/Theme.AppCompat.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowCloseOnTouchOutside">false</item>
</style>

<activity
     android:name="xActivity"
     android:theme="@style/AppTheme.Transparent" />

2
Kể từ năm 2018, đây sẽ là câu trả lời tốt nhất
Geek Guy

đã cho tôi một nền đen trên trình giả lập với API 28
Ai đó ở đâu đó vào

Tôi đã thử cách này để khắc phục sự cố liên quan đến cài đặt hướng trong Android 8.0 nhưng tôi vẫn nhận được IllegalStateException: Chỉ định hướng yêu cầu hoạt động mờ toàn màn hình
Rahul Sahni

3

Tôi chỉ làm hai việc, và nó làm cho hoạt động của tôi trở nên minh bạch. Họ ở dưới.

  1. Trong tệp kê khai tôi chỉ cần thêm mã dưới đây vào thẻ hoạt động .

    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
  2. Và tôi chỉ đặt nền của bố cục chính cho hoạt động đó là " # 80000000 ". Giống

    android:background="#80000000"

Nó hoàn toàn làm việc cho tôi.


3

Nếu bạn đang sử dụng AppCompatActivitythì hãy thêm nó vàostyles.xml

<style name="TransparentCompat" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation</item>
</style>

Trong manifesttệp bạn có thể thêm chủ đề này vào thẻ hoạt động như thế này

android:theme="@style/TransparentCompat"

để biết thêm chi tiết đọc bài viết này


2

Chỉ định chủ đề mờ

android:theme="@android:style/Theme.Translucent.NoTitleBar"

2

Có hai cách:

  1. Sử dụng Theme.NoDisplay
  2. Sử dụng Theme.Translucent.NoTitleBar

Sử dụng Theme.NoDisplayvẫn sẽ hoạt động nhưng chỉ trên các thiết bị Android cũ hơn. Trên Android 6.0 trở lên, sử dụng Theme.NoDisplay mà không gọi finish()vào onCreate() (or, technically, before onResume())sẽ làm hỏng ứng dụng của bạn. Đây là lý do tại sao khuyến nghị nên sử dụng Theme.Translucent.NoTitleBar, không bị giới hạn này .


1

Lưu ý 1: Trong thư mục Drawable, tạo test.xml và sao chép mã sau đây

   <?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <stroke android:width="2dp" />

    <gradient
        android:angle="90"
        android:endColor="#29000000"
        android:startColor="#29000000" />

    <corners
        android:bottomLeftRadius="7dp"
        android:bottomRightRadius="7dp"
        android:topLeftRadius="7dp"
        android:topRightRadius="7dp" />

</shape>

// Lưu ý: Góc và hình dạng theo yêu cầu của bạn.

// Lưu ý 2: Tạo xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/test"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1.09"
            android:gravity="center"
         android:background="@drawable/transperent_shape"
            android:orientation="vertical" >
     </LinearLayout>
    </LinearLayout>

0

Chỉ cần thêm dòng sau vào thẻ hoạt động trong tệp kê khai của bạn cần nhìn trong suốt.

android:theme="@android:style/Theme.Translucent"

0

Tất cả những câu trả lời có thể gây nhầm lẫn, có một sự khác biệt giữa Hoạt động trong suốt và Không có hoạt động UI.

Sử dụng cái này:

android:theme="@android:style/Theme.Translucent.NoTitleBar"

Sẽ làm cho hoạt động minh bạch nhưng sẽ chặn UI.

Nếu bạn muốn một hoạt động UI không hơn sử dụng này:

android:theme="@android:style/Theme.NoDisplay"


0

Bạn có thể xóa setContentView(R.layout.mLayout)khỏi hoạt động của mình và đặt chủ đề là android:theme="@style/AppTheme.Transparent". Kiểm tra liên kết này để biết thêm chi tiết.

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.