私のアプリでは、単一のアクティビティと他のすべてのフラグメントがあります
以下のようにstyle.xmlからアクティビティの背景を設定しています
<item name="Android:windowBackground">@color/very_light_gray</item>
今私は背景を透明にしたい特定の断片のみについて、私はそれを行うことができません
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// create ContextThemeWrapper from the original Activity Context with the custom theme
final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.yourCustomTheme);
// clone the inflater using the ContextThemeWrapper
LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper);
// inflate the layout using the cloned inflater, not default inflater
return localInflater.inflate(R.layout.yourLayout, container, false);
}
それを行う方法はありますか?
スタイルアプリの色にnullを使用
<item name="Android:windowBackground">null</item>
2つのステップ:
最初のステップ-背景を透明にして(XMLファイルに)ビューを作成します。
in Android studio、「res
」フォルダーを見つけて右クリックし、new -> Android resource file
。表示されるダイアログに置くよりも:
File name:
{ここに何かを入れてください。例えば-"my_fragment"(引用符なし)}小文字、数字、アンダースコアのみが問題ないことに注意してください
Resource type:
レイアウト
Root element:
LinearLayout(XMLレイアウトについての知識を深めたら、ここに他のものを置くことができます)
Source set:
メイン
Directory name:
レイアウト。
表示されるウィンドウで、「デザイン」ではなく「テキスト」モードに切り替えます(画面の左下にあるタブを探します)。
ファイルのコンテンツの代わりにこれをコピーアンドペーストするよりも(非常に似ているので、ここに「透明な」背景を追加します):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@Android:color/transparent"
>
</LinearLayout>
2番目のステップ-このレイアウトをフラグメントに展開します。
fragmentを拡張するフラグメントクラスを作成し、onCreateView()メソッドをオーバーライドします。そのメソッド内でビューを拡張し、それを返します。
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
// assuming you named your xml file "my_fragment":
// for other names replace R.layout.my_fragment with R.layout.put_your_name_here
View view = inflater.inflate(R.layout.my_fragment, container, false);
return view;
}
もちろん、アクティビティでフラグメントのインスタンスを作成することを忘れないでください!
アクティビティも透過的に設定する必要があります。
Android:background="@Android:color/transparent"
アクティビティには@color/very_light_gray
があるため、フラグメントを@Android:color/transparent
に設定しても機能しません。
重複を避けるために、各ビューには透明な背景が必要です。
したがって、アクティビティとフラグメントを特定のフラグメントに対して透過的にすることを前提としています(これがあなたの質問から望むものであるかどうかは明確ではありませんが、私はそれがそうであると仮定します)。 「透明」フラグメントが添付されている場合、アクティビティの背景が透明になります。他のフラグメントがアタッチされた場合、アクティビティの背景をリセットする必要があります。そうしないと、透明のままになります。
これを行うにはいくつかの方法がありますが、私は「かなり」簡単に何かを選びます。
あなたの透明な断片で:
@Override
public void onStart() {
super.onStart();
// I'm using null here because drawing nothing is faster than drawing transparent pixels.
getActivity().getWindow().setBackgroundDrawable(null);
getView().setBackground(null);
}
@Override
public void onStop() {
super.onStop();
getActivity().getWindow().setBackgroundDrawable(new ColorDrawable(@color/very_light_gray));
}
これが望む効果であるかどうかは完全にはわかりません。
幸運を。よろしく、CJ
簡単な方法は、その特定のフラグメントのルートレイアウトの背景色を次のように設定することです
Android:background = "@ Android:color/transparent"
コードの下にレイアウトフラグメントの背景を設定しました。
<LinearLayout
...
Android:background="@Android:color/transparent"/>
アクティビティコンテナレイアウトの背景は透明である必要があります。次に、フラグメントのレイアウトの背景色を設定します。特定のフラグメントのレイアウトについては、透明色を設定して必要なシナリオを取得します。
フラグメントをインスタンス化しながら、アクティビティで以下のコードのようなものを使用できます。 Color.Whiteの代わりに、独自の色を使用できます。
fragment.getView().setBackgroundColor(Color.WHITE);
この単一行をコードに追加します
getActivity().getWindow().setBackgroundDrawableResource(R.drawable.my_drawable);
アクティビティレイアウトのスタイルを次のように設定します
<style name="RootLayout" parent="AppTheme">
<item name="Android:background">@drawable/app_transparent_background</item>
</style>
アクティビティの親レイアウトに次のように設定します
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
style="@style/RootLayout"
...>
白または他の色付きの背景を設定する他のフラグメントでは、それらのフラグメントのメインレイアウトに異なるスタイルを設定します。
それが動作します