[android] 조각에 대한 테마 설정

조각에 대한 테마를 설정하려고합니다.

매니페스트에서 테마 설정이 작동하지 않습니다.

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()조각의 루트 뷰를 부풀리기 전에 조각 에서 작동합니다.


답변

나는 또한 내 조각 대화 상자를 활동과 다른 테마로 표시하려고 시도 했으며이 솔루션을 따랐습니다 . 댓글에 언급 된 일부 사람들과 마찬가지로 작동하지 않았고 매니페스트에 지정된 테마로 대화가 계속 표시되었습니다. 문제는 방법 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를 추가하는 코드 조각을 제공하면 도움이 될 수 있습니다.

유용한 링크 :

Fragment의 Custom ListView가 상위 테마를 준수하지 않습니다.


답변

나는 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);
} 


답변

조금 늦었지만 도움이 되었기 때문에 다른 사람에게 도움이 될 수 있습니다. 조각의 onCreatView 함수 안에 아래 코드 줄을 추가해 볼 수도 있습니다.

    inflater.context.setTheme(R.style.yourCustomTheme)