조각에 대한 테마를 설정하려고합니다.
매니페스트에서 테마 설정이 작동하지 않습니다.
android:theme="@android:style/Theme.Holo.Light"
이전 블로그를 보면 ContextThemeWrapper를 사용해야하는 것처럼 보입니다. 누구든지 코딩 된 예제를 참조 할 수 있습니까? 아무것도 찾을 수 없습니다.
조각에 대한 테마를 설정하려고합니다.
매니페스트에서 테마 설정이 작동하지 않습니다.
android:theme="@android:style/Theme.Holo.Light"
이전 블로그를 보면 ContextThemeWrapper를 사용해야하는 것처럼 보입니다. 누구든지 코딩 된 예제를 참조 할 수 있습니까? 아무것도 찾을 수 없습니다.
답변:
매니페스트의 테마 설정은 일반적으로 활동에 사용됩니다.
Fragment에 테마를 설정하려면 Fragment의 onCreateView ()에 다음 코드를 추가합니다.
@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);
}
Fragment는 활동에서 테마를 가져옵니다. 각 조각에는 그것이 존재하는 활동의 테마가 할당됩니다.
테마는 Fragment.onCreateView 메서드에 적용되며, 여기서 코드는 실제로 테마가 사용되는 개체 인 뷰를 생성합니다.
Fragment.onCreateView에서는 뷰를 확장하는 LayoutInflater 매개 변수를 가져오고 테마에 사용되는 컨텍스트를 보유합니다. 실제로 이것이 바로 Activity입니다. 따라서 부풀려진 뷰는 활동의 테마를 사용합니다.
테마를 재정의하려면 LayoutInflater.cloneInContext를 호출 할 수 있으며 , 이는 테마 변경에 사용될 수 있음을 문서에서 언급합니다. 여기에서 ContextThemeWrapper를 사용할 수 있습니다. 그런 다음 복제 된 팽창기를 사용하여 조각의보기를 만듭니다.
단일 스타일을 적용하기 위해 방금 사용한
getContext().getTheme().applyStyle(styleId, true);
onCreateView()
조각의 루트 뷰를 부풀리기 전에 조각 에서 작동합니다.
getContext()
나는 또한 내 조각 대화 상자를 활동과 다른 테마로 표시하려고 시도 했으며이 솔루션을 따랐습니다 . 댓글에 언급 된 일부 사람들과 마찬가지로 작동하지 않았고 매니페스트에 지정된 테마로 대화가 계속 표시되었습니다. 문제는 방법 AlertDialog.Builder
에서 사용하여 대화를 onCreateDialog
작성하고 있으므로 onCreateView
연결된 답변에 표시된 방법 을 사용하지 않는 것으로 밝혀졌습니다. 그리고 인스턴스화 할 때 인스턴스화 된 AlertDialog.Builder
것을 대신 getActivity()
사용해야 할 때를 사용하여 컨텍스트에서 전달했습니다 ConstextThemeWrapper
.
다음은 내 onCreateDialog의 코드입니다.
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Create ContextThemeWrapper from the original Activity Context
ContextThemeWrapper contextThemeWrapper = new ContextThemeWrapper(getActivity(), android.R.style.Theme_DeviceDefault_Light_Dialog);
LayoutInflater inflater = getActivity().getLayoutInflater().cloneInContext(contextThemeWrapper);
// Now take note of the parameter passed into AlertDialog.Builder constructor
AlertDialog.Builder builder = new AlertDialog.Builder(contextThemeWrapper);
View view = inflater.inflate(R.layout.set_server_dialog, null);
mEditText = (EditText) view.findViewById(R.id.txt_server);
mEditText.requestFocus(); // Show soft keyboard automatically
mEditText.setOnEditorActionListener(this);
builder.setView(view);
builder.setTitle(R.string.server_dialog);
builder.setPositiveButton(android.R.string.ok, this);
Dialog dialog = builder.create();
dialog.setCanceledOnTouchOutside(false);
return dialog;
}
원래 AlertDialog.Builder
다음과 같이 인스턴스화되었습니다.
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
내가 변경 :
AlertDialog.Builder builder = new AlertDialog.Builder(contextThemeWrapper);
이 변경 후 조각 대화 상자가 올바른 테마로 표시되었습니다. 따라서 다른 사람이 비슷한 문제를 가지고 있고을 사용하고 있다면 AlertDialog.Builder
빌더에 전달되는 컨텍스트를 확인하십시오. 도움이 되었기를 바랍니다! :)
android:minSdkVersion="11"
매니페스트에 설정 했는지 확인하십시오 . 이것이 David의 모범이 당신에게 효과가 없었던 이유 일 수 있습니다.
또한, 설정 android:theme="@android:style/Theme.Holo.Light"
에 대한 속성 <application>
태그와 NOT<activity>
태그를.
또 다른 가능한 문제는 ContextThemeWrapper()
. 같은 것을 사용하는 경우 대신 getActivity().getApplicationContext()
교체하십시오 getActivity()
.
일반적으로 Theme.Holo는 MainActivity에 연결된 Fragments에 적용되어야합니다.
Fragment에 다른 테마 를 적용하려면 ContextThemeWrapper를 사용합니다 . MainActivity에서 Fragments를 추가하는 코드 조각을 제공하면 도움이 될 수 있습니다.
유용한 링크 :
나는 David가 제안한 솔루션을 시도했지만 모든 시나리오에서 작동하지는 않았습니다.
1. 스택에 추가 된 첫 번째 조각에는 onCrateView에 정의 된 것이 아니라 활동의 테마가 있지만 두 번째 조각에는 스택에 추가하면 조각에 적용되었습니다.
2. 올바르게 표시된 두 번째 조각에서 다음을 수행했습니다. 메모리를 정리하여 앱을 강제로 닫고 앱을 다시 열고 조각으로 활동이 다시 생성되었을 때 조각이 잘못 변경되었습니다. 조각의 onCrateView에 설정된 것과 동일하지 않습니다.
문제를 해결하기 위해 작은 변경을 수행하고 inflater.inflate의 컨테이너 인수를 null로 대체했습니다.
나는 inflater가 컨테이너 뷰의 컨텍스트를 일부 시나리오에서 사용하는 방법을 모르겠습니다.
참고-android.support.v4.app.Fragment & android.support.v7.app.AppCompatActivity를 사용하고 있습니다.
@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, null, false);
}
특정 조각에 스타일을 적용하려면 호출하기 전에 onCreateView()
또는 onAttach()
조각 에이 줄을 추가하십시오 .
getActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
getActivity().getWindow().setStatusBarColor(Color.TRANSPARENT);
투명 상태 표시 줄을 설정 하려면 루트 레이아웃의 속성에 false 를 설정 fitsSystemWindows
합니다.
android:fitsSystemWindows="false"
인플레이터를 호출하기 전에 조각 컨텍스트에 테마를 설정하여 작동하도록했습니다.
참고 : 이것은 MvvmCross와 결합 된 Xamarin.Android의 예입니다. 이것이 Java 프로그래머에게도 작동하는지 100 % 확실하지 않습니다. 하지만 시도해 볼 수 있습니다 :)
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
Context.SetTheme(Theme);
base.OnCreateView(inflater, container, savedInstanceState);
var view = this.BindingInflate(FragmentLayoutId, container, false);
// Doing some other stuff
return view;
}
SetTheme 확장 메서드 코드
public static void SetTheme(this Context context, AppThemeStyle themeStyle)
{
var themeStyleResId = themeStyle == AppThemeStyle.Dark ? Resource.Style.AppTheme : Resource.Style.AppTheme_Light;
context.SetTheme(themeStyleResId);
}
나는 이것이 일부 사람들을 돕기를 바랍니다.
android:theme = "@style/myTheme"
조각의 레이아웃 파일을 사용하여 문제를 해결했습니다 . 예를 들어 이것은의 스타일을 변경 LinearLayout
하지만 LinearLayout
. 따라서 모든 스타일로 전체 조각을 장식하려면 가장 바깥 쪽의 상위 레이아웃에 테마를 적용합니다.
참고 : 아직 해결책을 찾지 못했다면 시도해 볼 수 있습니다.
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:theme = "@style/myTheme" >
<TextView
android:id="@+id/tc_buttom_text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Time elapsed"/>
<TextView
android:id="@+id/tc_buttom_text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="00:00:00 00"/>
</LinearLayout>
onAttach에서 롤리팝을 시도해 볼 수 있습니다.
최종 창 창 = activity.getWindow (); window.setStatusBarColor (myStatusBarColor)
ondettach에서 기본값으로 다시 설정하십시오.