كيف أقوم بإنشاء نشاط شفاف على Android؟




android-activity transparent (12)

هناك طريقان ،

  1. باستخدام Theme.NoDisplay
  2. باستخدام Theme.Translucent.NoTitleBar

Theme.NoDisplay استخدام Theme.NoDisplay ... ولكن فقط على أجهزة Android القديمة. على نظام Android 6.0 والإصدارات الأحدث ، يؤدي استخدام Theme.NoDisplay دون استدعاء finish() في onCreate() (or, technically, before onResume()) إلى تعطل تطبيقك. هذا هو السبب في أن التوصية هي استخدام Theme.Translucent.NoTitleBar ، والتي لا تعاني من هذا القيد . "

أرغب في إنشاء نشاط شفاف أعلى نشاط آخر.

كيف يمكنني تحقيق ذلك؟


أسهل طريقة للعثور عليها هي تعيين android:theme="@android:style/Theme.Holo.Dialog" النشاط في AndroidManifest على android:theme="@android:style/Theme.Holo.Dialog" .

ثم في أسلوب onCreate للنشاط ، استدعاء getWindow().setBackgroundDrawable(new ColorDrawable(0)); .


بالنسبة إلى نشاط الحوار ، استخدم هذا:

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

ولكن تحتاج أيضًا إلى تعيين العرض الرئيسي في النشاط إلى غير مرئي. وإلا ستكون الخلفية غير مرئية بينما ستكون جميع المشاهدات فيها مرئية.


تعيينه موضوع شفاف

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

عيّن المظهر الشفاف للنشاط الذي تريد جعله شفافًا في ملف بيان Android لمشروعك:

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

في حالتي ، لا بد لي من وضع موضوع على وقت التشغيل في جافا على أساس بعض الشروط. لذلك قمت بإنشاء موضوع واحد في نمط (على غرار إجابات أخرى):

<?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); . لقد أخطأت هذه النقطة وتمسكت لمدة ساعتين ، معتقدًا أن سبب الموضوع لا ينعكس في وقت التشغيل.


كنت أرغب في إضافة القليل من ذلك إلى مطوري 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>

في ملفاتي color.xml الأصلي كان لدي علامة "drawable":

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

ولذا فعلت ذلك للون كذلك ، لكنني لم أفهم أن المرجع "@ اللون /" يعني البحث عن علامة "اللون" في XML. اعتقدت أنني يجب أن أذكر هذا أيضا لمساعدة أي شخص آخر.


لقد فعلت شيئين فقط ، وجعلت نشاطي شفافًا. هم أدناه.

  1. في ملف البيان ، أضفت الرمز التالي في علامة النشاط .

    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
    
  2. وأضع خلفية المخطط الرئيسي لهذا النشاط كـ " # 80000000 ". مثل

    android:background="#80000000"
    

انها تعمل تماما بالنسبة لي.


ما عليك سوى السماح لصورة خلفية النشاط بالشفافية. أو أضف السمة في ملف XML:

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

مع مكتبة "AppCompat" أو "مكتبة دعم تصميم Android" ، تكون مختلفة قليلاً:

في الأنماط. 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>

يذهب مثل هذا:

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

أضف النمط التالي في ملف 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 ملف res/values/color.xml . يمكنك أيضًا استخدام @android:color/transparent في إصدارات Android الأحدث).

ثم قم بتطبيق النمط على نشاطك ، على سبيل المثال:

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






transparent