Programming

프로그래밍 방식으로 활동 테마 변경

procodes 2020. 8. 14. 21:03
반응형

프로그래밍 방식으로 활동 테마 변경


특정 경우 내 활동에서 대화 테마를 제거해야하지만 작동하지 않는 것 같습니다. 여기에 예가 있습니다.

첫 번째 활동 :

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    startActivity(new Intent(MainActivity.this, SecondActivity.class));
}

두 번째 활동 :

public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setTheme(android.R.style.Theme);
    setContentView(R.layout.activity_second);
}

매니페스트 발췌 :

 <activity android:name="SecondActivity" android:theme="@android:style/Theme.Dialog"></activity>

내가 실행할 때 여전히 대화 테마입니다.

API10

감사.


마찬가지로 문서는 말을 당신은 전화를해야 setTheme모든보기 출력하기 전에. 처리에 super.onCreate()참여 하는 것 같습니다 view.

따라서 테마간에 동적으로 전환하려면 다음 과 같이 setTheme먼저 호출 super.onCreate하면됩니다.

public void onCreate(Bundle savedInstanceState) {
    setTheme(android.R.style.Theme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
}

user1462299의 응답은 훌륭하게 작동하지만 fragments를 포함 하면 원래 활동 테마를 사용합니다. 테마를 모든 조각에도 적용하려면 대신 Context 의 getTheme () 메서드를 재정의 할 수 있습니다 .

@Override
public Resources.Theme getTheme() {
    Resources.Theme theme = super.getTheme();
    if(useAlternativeTheme){
        theme.applyStyle(R.style.AlternativeTheme, true);
    }
    // you could also use a switch if you have many themes that could apply
    return theme;
}

더 이상 onCreate () 메서드에서 setTheme ()를 호출 할 필요가 없습니다. 이러한 방식으로이 컨텍스트 내에서 현재 테마를 가져 오기 위해 모든 요청을 재정의합니다.


내가 늦었지만 여기에 해결책을 게시하고 싶습니다 . 여기
에서 전체 소스 코드를 확인 하십시오 .
환경 설정을 사용하여 테마를 변경할 때 사용한 코드입니다 ..

SharedPreferences pref = PreferenceManager
        .getDefaultSharedPreferences(this);
String themeName = pref.getString("prefSyncFrequency3", "Theme1");
if (themeName.equals("Africa")) {
    setTheme(R.style.AppTheme);



} else if (themeName.equals("Colorful Beach")) {
    //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();
    setTheme(R.style.beach);


} else if (themeName.equals("Abstract")) {
    //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();

    setTheme(R.style.abstract2);

} else if (themeName.equals("Default")) {

    setTheme(R.style.defaulttheme);

}

setcontentview 앞에 코드를 넣어야합니다.

즐거운 코딩!


이것은 나를 위해 잘 작동합니다.

theme.applyStyle(R.style.AppTheme, true)

용법:

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    //The call goes right after super.onCreate() and before setContentView()
    theme.applyStyle(R.style.AppTheme, true)
    setContentView(layoutId)
    onViewCreated(savedInstanceState)
}

참고 URL : https://stackoverflow.com/questions/11562051/change-activitys-theme-programmatically

반응형