2016-07-27 14 views
0

私はかなり共通の要件があります。Androidのアクティビティ透明な背景

モバイルデバイスではフルスクリーン(標準サイズ)、タブレットデバイスではダイアログ(サイズが大きく、サイズがXLarge)のようなアクティビティがあります。

どちらの形式でも、Horizo​​ntal-ProgressBar、Load-IndicatorなどのCircular-ProgressBarなど、ActivityのコンテンツビューにUIウィジェットが表示されています。カスタムブランドの色など私はこの要件を忘れることはできません。

私は既定のAndroidテーマとスタイルに基づいてカスタムスタイルを定義し、すべてのアクティビティでそれらをアプリケーション全体で使用しています。以下はカスタムテーマです。私は唯一のタブレットデバイスのために上記に記載された特定の活動のためのアプリケーション、およびAppTheme.Dialog内のすべての活動全体のデフォルトのテーマとしてAppThemeを使用

<!-- Base application theme. --> 
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar"> 
    <item name="android:colorPrimary" tools:ignore="NewApi"> 
     @color/light_black 
    </item> 
    <item name="colorPrimary">@color/light_black</item> 
    <item name="android:colorAccent" tools:ignore="NewApi">@color/sapphire</item> 
    <item name="colorAccent">@color/sapphire</item> 
    <item name="android:colorBackground">@color/primary_background</item> 
    <item name="android:textColorPrimary">@color/title_color</item> 
    <item name="android:colorButtonNormal" tools:ignore="NewApi">@color/sapphire</item> 
    <item name="colorButtonNormal">@color/sapphire</item> 
    <item name="android:colorForeground" tools:ignore="NewApi"> 
     @color/title_color 
    </item> 
    <item name="android:titleTextStyle">@style/toolbar_title</item> 
    <item name="android:navigationIcon" tools:ignore="NewApi">?android:attr/homeAsUpIndicator</item> 
    <item name="navigationIcon">?android:attr/homeAsUpIndicator</item> 
    <item name="android:colorControlNormal" tools:ignore="NewApi">@color/white</item> 
    <item name="colorControlNormal">@color/white</item> 
</style> 

<style name="AppTheme.Light" parent="AppTheme"> 
    <item name="android:windowBackground">@color/white</item> 
</style> 

<style name="AppTheme.Dialog" parent="AppTheme.Light"> 
    <item name="android:windowBackgroundFallback" tools:ignore="NewApi"> 
     @android:color/transparent</item> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:colorBackgroundFloating" tools:ignore="NewApi"> 
     @android:color/transparent</item> 
    <item name="windowActionBar">false</item> 
    <item name="windowActionBarOverlay">false</item> 
    <item name="windowActionModeOverlay">false</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowClipToOutline" tools:ignore="NewApi">false</item> 
    <item name="android:windowTitleStyle">@null</item> 
    <item name="android:windowTitleBackgroundStyle">@null</item> 
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:windowIsFloating">true</item> 
    <item name="android:windowCloseOnTouchOutside">true</item> 
    <item name="android:windowEnableSplitTouch">true</item> 
    <item name="android:fitsSystemWindows">true</item> 
    <item name="android:fillViewport">true</item> 
    <item name="android:backgroundDimEnabled">true</item> 
    <item name="android:backgroundDimAmount">0.2</item> 
</style> 

。アクティビティは、タブレット画面の中央に配置されたフローティングダイアログウィンドウとして表示され、一般的なダイアログのように外部に触れたときにすべて消えますが、アクティビティのウィンドウ - 背景はピッチインキ - ブラックのようです。

私の要件は、Tabletデバイスのフローティングダイアログとしてのアクティビティには、前回のアクティビティウィンドウを示す透明な背景が必要であることです。

Theme.DialogやTheme.Translucentを使わずにこれを実現するには、以前の「AppTheme」スタイルから変更しないUIウィジェットのMaterial-Design仕様が必要です。

また、Activityクラスで宣言された多くのカスタムプライベートメソッドを再利用する必要があるため、Content-ViewレイアウトファイルをDialogインスタンスに読み込むことは特に確実ではありません。

ああ、btw、compileSdkVersionは最新24、minSdkVersionは16、targetSdkVersionは24です。buildToolsVersionも24.0.1で最新ですが、それはまったく別の問題です。

答えて

0

だから、やっと私は考えました。 同じアクティビティのAndroid-Manaestのデフォルトテーマとして「AppTheme.Light」を宣言しました。これは、モバイルデバイスに白い不透明な背景がフルスクリーンで表示され、同じアクティビティがタブレットデバイスのフローティングダイアログを使用していたので、アクティビティのライフサイクル内のテーマを「プログラム的に」AppTheme.Dialogに設定しました。

同じことを逆にする必要があります。タブレットデバイス用のAndroidマニフェストファイルで該当テーマを宣言し、デバイスの画面サイズが標準または小の場合は、すべてのFloating-Dialogプロパティを全画面レイアウトモードに書き換える必要があります。

1

Dialogを使用して透明テーマを作成します。

サンプル:

Dialog alertDialog = new Dialog(this); 
alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
alertDialog.setContentView(R.layout.tabs); 
alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
alertDialog.show(); 

注:AlertDialogビルダーは、実際に透明ダイアログを設計するためのよくないと、常に実際にそれのためのテーマであるこの黒い背景を持つことになります。

For more refer this link

+0

私が言及したように、私はダイアログインスタンスを使いたくありません。私は、アクティビティをLargeとXLarge Devicesの透明な背景浮動ウィンドウを持つDialogとして表示したいが、NormalとSmall Devicesのフルスクリーンウィンドウとしたい。また、タブレットデバイス固有のダイアログインスタンスを使用する場合、多くのクリック機能とユーザー対話をリファクタリングする必要があります。 – AndroidRocks

0

新しいフラグメントを交換するが、前のものの上にそれを追加し、のような透明な背景色でテーマを定義しないように覚えて、その後、フラグメントを使用している場合。

アクティビティを使用している場合は、使用しているアクティビティまたはダイアログに透明テーマの背景を使用してください。

+0

私はフラグメントを使用していません。フラグメントは不適切な設計であり、後処理されているため、アクティビティのライフサイクルの後にフラグメントライフサイクルが実行され、アクティビティのコンテンツビューのドローサイクルが完了することを意味します。透明テーマの背景については、前述したように、Theme.AppCompatの外観が明らかに異なるHorizo​​ntal Progress-Barなど、指定されたMaterial-Designスタイルのガイドラインに厳密に準拠する必要がある他のUIウィジェットがあります。 NoActionBar、Theme.Dialog、およびTheme.Translucentです。 – AndroidRocks