ฉันจะสร้างกิจกรรมที่โปร่งใสบน Android ได้อย่างไร


915

ฉันต้องการสร้างกิจกรรมที่โปร่งใสด้านบนของกิจกรรมอื่น

ฉันจะบรรลุสิ่งนี้ได้อย่างไร

คำตอบ:


1392

เพิ่มสไตล์ต่อไปนี้ในres/values/styles.xmlไฟล์ของคุณ(หากคุณยังไม่มีให้สร้างมัน) นี่คือไฟล์ที่สมบูรณ์:

<?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>

(ค่า@color/transparentคือค่าสี#00000000ที่ฉันใส่ไว้ในres/values/color.xmlไฟล์คุณยังสามารถใช้@android:color/transparentใน Android รุ่นที่ใหม่กว่า)

จากนั้นใช้สไตล์กับกิจกรรมของคุณเช่น:

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

13
ฉันใช้<item name="android:windowBackground">@android:color/transparent</item>
บางคนอยู่ที่ไหนสักแห่ง

33
ที่ดี! การปรับปรุงเพียงครั้งเดียว: หากคุณใช้ parent = "@ android: style / Theme.Dialog" คุณจะได้รับพฤติกรรมการโต้ตอบที่แน่นอน นั่นหมายถึงการซีดจางเข้า / ออกแทนที่จะเลื่อนเข้า / ออก (เช่นกิจกรรม)
PakitoV

73
ดังที่ @Emilio พูดถึงสิ่งนี้จะทำงานเหมือนการโต้ตอบเป็นส่วนใหญ่เนื่องจากandroid:windowIsFloatingตั้งค่าเป็นจริง ลบคุณสมบัตินี้เพื่อทำตัวเหมือนกิจกรรมปกติ (ในกรณีนี้มันจะจับคู่android:style/Theme.Translucent.NoTitleBar)
aromero

38
ฉันลบ <item name = "android: windowIsFloating"> true </item> เพื่อให้มีกิจกรรมแบบเต็มหน้าจอและโปร่งใส
Kiem Duong

12
AppCompatActivityกิจกรรมของฉันได้มาจาก ดังนั้นparent="android:Theme"เป็น crashing app ของฉัน ฉันเพิ่งลบมันออกไปและมันก็ทำงานได้เหมือนมีเสน่ห์ ขอบคุณ!
Atul

193

มันจะเป็นเช่นนี้:

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

3
คุณเพิ่งเพิ่มชุดรูปแบบตามที่ alex โพสต์ลงประกาศกิจกรรมของคุณในไฟล์ Manifest นี้ bit android: theme = "@ android: style / Theme.Translucent.NoTitleBar สำหรับแต่ละกิจกรรมคุณสามารถกำหนดธีมโปร่งแสง
Donal Rafferty

12
@UMMA: โดยทั่วไปการใช้เครื่องหมายคำถามจะเพียงพอ เครื่องหมายคำถามหลายข้อทำให้คนที่ใช้เวลาในการตอบคำถามของคุณคิดว่าคุณกำลังกระโดดไปที่ใบหน้าของพวกเขา
Matthias

7
@Matthias พวกเขามักจะเป็นเพราะเจ้านายของพวกเขา jumpin 'ที่พวกเขา
Reno

16
@ 50% black should be #7f000000user1129443: แต่ละองค์ประกอบ (A, R, G, B) สามารถรับค่า0-255ได้ 50% of 255 = 127. 127 in Hex = 7Fวิธีการคำนวณความโปร่งใส (ความทึบ)
Nam Trung

4
เมธอดนี้ใช้ล็อก UI ขณะที่กิจกรรมกำลังทำงาน แต่เนื่องจากถูกตั้งค่าเป็นโปร่งแสงจึงไม่มีวิธีทำสิ่งใดจึงมีวิธีหลีกเลี่ยงการล็อก UI นี้
Akhil Latta

126

ใน styles.xml:

<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>

ใน AndroidManifest.xml:

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

1
หากคุณวางแผนที่จะแสดงบางสิ่งบางอย่างในกิจกรรมนี้ (พูดโต้ตอบหรือ DialogFragment) คุณจะสังเกตเห็นว่าทุกอย่างเป็นธีมมืด ดังนั้นคุณอาจต้องการให้ธีมของคุณสืบทอดมาTheme.Appcompat.Light.NoActionBarแทน
tir38

1
ในกรณีของฉันมันแสดงพื้นหลังสีดำฉันมีชุดรูปแบบผู้ปกครองกำหนดอย่างอื่น แต่ในกิจกรรมหนึ่งฉันเปลี่ยนชุดรูปแบบตามที่กล่าวถึงความช่วยเหลือใด ๆ
Abdul Waheed

4
ใช้งานได้ดีเมื่อฉันลบ "android: background"
Oded Breiner

2
ฉันคิดว่าคุณต้องการลบbackgroundและใส่สีกึ่งโปร่งใสที่คุณต้องการในwindowBackground
hmac

นี่ควรเป็นคำตอบหากกิจกรรมของคุณใช้ AppCompatActivity ตรงกันข้ามกับคำตอบของ @ gnobal
AeroEchelon

37

ประกาศกิจกรรมของคุณในรูปแบบนี้:

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

และเพิ่มพื้นหลังโปร่งใสในเค้าโครงของคุณ


วิธีที่ดีที่สุด. ขอบคุณ
ปีเตอร์

5
คุณต้องใช้ธีม Theme.AppCompat (หรือลูกหลาน) กับกิจกรรมนี้
Puni

28

กำหนดธีมโปร่งแสงให้กับกิจกรรมที่คุณต้องการทำให้โปร่งใสในไฟล์รายการ Android ของโครงการของคุณ:

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

16

ฉันต้องการที่จะเพิ่มลงในนี้เล็กน้อยเพราะฉันเป็นนักพัฒนา Android ใหม่เช่นกัน คำตอบที่ยอมรับนั้นยอดเยี่ยม แต่ฉันเจอปัญหาบางอย่าง ฉันไม่แน่ใจว่าจะเพิ่มสีลงในไฟล์ colors.xml ได้อย่างไร นี่คือวิธีที่ควรทำ:

colors.xml

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

ในไฟล์ colors.xml ดั้งเดิมของฉันฉันมีแท็ก "drawable":

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

ดังนั้นฉันก็ทำเช่นนั้นสำหรับสีด้วย แต่ฉันไม่เข้าใจว่าการอ้างอิง "@ color /" หมายถึงมองหาแท็ก "สี" ใน XML ฉันคิดว่าฉันควรพูดถึงสิ่งนี้เช่นกันเพื่อช่วยเหลือผู้อื่น


16

ฉันทำได้ใน 2.3.3 โดยเพียงเพิ่มandroid:theme="@android:style/Theme.Translucent"ในแท็กกิจกรรมในรายการ

ฉันไม่รู้เกี่ยวกับรุ่นที่ต่ำกว่า ...


ทำงานได้ดีสำหรับ 2.2 เช่นกัน ฉันเพิ่งสร้างกิจกรรมง่าย ๆ ด้วย listview และมันลอยอยู่บนกิจกรรมล่าสุด
slott

มันถูกเพิ่มเข้ามาใน API 1 นั่นไม่ใช่ปัญหา :)
xmen

6
อย่าใช้AppCompatActivityหากคุณกำลังใช้สิ่งนี้
zackygaurav

ทำงานใน 7.0 ดังนั้นวิธีการที่ดี ฉันแก้ไขเป็น @android: style / Theme.Translucent.NoTitleBar.Fullscreen
Sandeep

16

ในกรณีของฉันฉันต้องตั้งค่าธีมบนรันไทม์ใน java ตามเงื่อนไขบางประการ ดังนั้นฉันจึงสร้างธีมหนึ่งแบบ (คล้ายกับคำตอบอื่น):

<?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>

จากนั้นใน Java ฉันใช้กับกิจกรรมของฉัน:

@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);
}

จำได้ว่าหนึ่งในจุดที่สำคัญที่นี่: คุณต้องเรียกใช้ฟังก์ชั่นก่อนsetTheme() super.onCreate(savedInstanceState);ฉันพลาดจุดนี้และติดขัดเป็นเวลา 2 ชั่วโมงโดยคิดว่าทำไมรูปแบบของฉันจึงไม่สะท้อนให้เห็นในเวลาทำงาน


9

ในฟังก์ชั่นonCreateใต้setContentViewให้เพิ่มบรรทัดนี้:

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

23
ทำให้พื้นหลังเป็นสีดำสนิทด้วยเหตุผลบางอย่าง
Subin Sebastian

ฉันก็เช่นกัน @SubinSebastian มีใครบ้างที่แก้ไขปัญหานี้
finnmglas

8

เพียงให้ภาพพื้นหลังของกิจกรรมมีความโปร่งใส หรือเพิ่มธีมในไฟล์ XML:

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

7

วิธีที่ง่ายที่สุดที่ฉันได้พบคือการกำหนดรูปแบบของกิจกรรมใน AndroidManifest android:theme="@android:style/Theme.Holo.Dialog"ไป

จากนั้นในกิจกรรมของวิธี onCreate getWindow().setBackgroundDrawable(new ColorDrawable(0));โทร


6

สำหรับกิจกรรมการโต้ตอบฉันใช้สิ่งนี้:

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

แต่คุณต้องตั้งค่ามุมมองหลักของคุณในกิจกรรมให้มองไม่เห็น มิฉะนั้นจะมองไม่เห็นพื้นหลังในขณะที่มุมมองทั้งหมดในนั้นจะมองเห็นได้


2
ทำให้พื้นหลังเป็นสีดำสนิท
ucMedia

5

นอกเหนือจากคำตอบข้างต้น:

เพื่อหลีกเลี่ยงความผิดพลาดที่เกี่ยวข้องกับ Android Oreo เกี่ยวกับกิจกรรม

<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
ในปี 2018 คำตอบ
Geek Guy

ให้พื้นหลังสีดำกับตัวจำลองด้วย API 28
คนอยู่ที่ไหนสักแห่งที่

ฉันพยายามแก้ไขข้อผิดพลาดที่เกี่ยวข้องกับการตั้งค่าการวางแนวใน Android 8.0 แต่ฉันยังคงได้รับ IllegalStateException: เฉพาะกิจกรรมทึบแสงแบบเต็มหน้าจอขอปฐมนิเทศ
Rahul Sahni

3

ฉันเพิ่งทำสองสิ่งและทำให้กิจกรรมของฉันโปร่งใส พวกเขาอยู่ด้านล่าง

  1. ในไฟล์รายการฉันเพิ่งเพิ่มโค้ดด้านล่างในแท็กกิจกรรม

    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
  2. และฉันเพิ่งตั้งพื้นหลังของเค้าโครงหลักสำหรับกิจกรรมนั้นเป็น " # 80000000 " ชอบ

    android:background="#80000000"

มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน


3

หากคุณกำลังใช้อยู่ให้AppCompatActivityเพิ่มสิ่งนี้ในstyles.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>

ในmanifestไฟล์คุณสามารถเพิ่มธีมนี้ในแท็กกิจกรรมเช่นนี้

android:theme="@style/TransparentCompat"

สำหรับรายละเอียดเพิ่มเติมอ่านบทความนี้



2

มีสองวิธี:

  1. ใช้ Theme.NoDisplay
  2. ใช้ Theme.Translucent.NoTitleBar

การใช้Theme.NoDisplayจะยังคงทำงานอยู่… แต่เฉพาะกับอุปกรณ์ Android รุ่นเก่า บน Android 6.0 และสูงกว่าการใช้ Theme.NoDisplay โดยไม่ต้องโทรfinish()เข้าonCreate() (or, technically, before onResume())จะทำให้แอปของคุณขัดข้อง นี่คือเหตุผลที่แนะนำให้ใช้Theme.Translucent.NoTitleBarซึ่งไม่ได้รับผลกระทบจากข้อ จำกัดนี้ "


1

หมายเหตุ 1: ในโฟลเดอร์ Drawable สร้าง test.xml และคัดลอกรหัสต่อไปนี้

   <?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>

// หมายเหตุ: มุมและรูปร่างเป็นไปตามความต้องการของคุณ

// หมายเหตุ 2: สร้าง 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

เพียงเพิ่มบรรทัดต่อไปนี้ในแท็กกิจกรรมในไฟล์รายการที่ต้องดูโปร่งใส

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

0

คำตอบทั้งหมดนั้นอาจสร้างความสับสนมีความแตกต่างระหว่างกิจกรรมโปร่งใสและไม่มีกิจกรรม UI

ใช้สิ่งนี้:

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

จะทำให้กิจกรรมโปร่งใส แต่จะบล็อก UI

หากคุณต้องการกิจกรรมไม่มี UI มากกว่าใช้สิ่งนี้:

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


0

คุณสามารถลบจากการดำเนินกิจกรรมและการตั้งค่ารูปแบบของคุณเป็นsetContentView(R.layout.mLayout) android:theme="@style/AppTheme.Transparent"ตรวจสอบลิงค์นี้สำหรับรายละเอียดเพิ่มเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.