गतिविधि की थीम को प्रोग्रामेटिक रूप से बदलें


121

विशेष मामलों में मुझे अपनी गतिविधि से संवाद विषय को हटाने की आवश्यकता है लेकिन यह काम नहीं करता है। यहाँ एक उदाहरण है

पहली गतिविधि:

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

धन्यवाद।

जवाबों:


183

जैसा कि डॉक्स कहते हैं कि आपको 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);
}

स्टैक एंड्रॉइड 5.1 के साथ MotoG (v1) पर मेरे लिए काम करता है। यदि यह आपके लिए काम नहीं कर रहा है तो कृपया डिवाइस + Android संस्करण साझा करें।
lenrok258

मुझे यहाँ वर्णित एक विषय को परिभाषित करना था: stackoverflow.com/a/44236460/3211335 और फिर इसे इस उत्तर द्वारा वर्णित के रूप में सेट करें। यह बहुत अच्छा काम करता है।
लालूटॉप

वैसे भी क्या हम केवल एक बार विषय सेट कर सकते हैं ... सेट विषय के बजाय प्रति पृष्ठ
gayan1991

मैं थीम को बचाने के लिए साझा प्राथमिकता का उपयोग करता हूं, लेकिन ऐप को पुनरारंभ करते समय, एक पल के लिए पहला विषय दिखाई देता है, फिर दूसरा विषय दिखाया गया है!
मोहम्मद अफशरत

1
@ gayan1991 आप अपने विषय को परिभाषित करने के लिए एक अन्य गतिविधि का उपयोग कर सकते हैं और अपनी सभी अन्य गतिविधियों को इस एक पूर्व का विस्तार कर सकते हैं: pastebin.com/r93qrRDG संपादित करें: बेहतर प्रारूपण करने के लिए
पास्टबिन का

46

user1462299 की प्रतिक्रिया महान काम करती है, लेकिन यदि आप टुकड़े शामिल करते हैं , तो वे मूल गतिविधियों के विषय का उपयोग करेंगे। सभी टुकड़ों के लिए विषय को लागू करने के लिए आप संदर्भ के बजाय 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 () को कॉल करने की आवश्यकता नहीं है। आप इस संदर्भ में वर्तमान विषय को इस प्रकार प्राप्त करने के लिए हर अनुरोध को ओवरराइड कर रहे हैं।


2
@ जिसने भी डाउनवोट किया: यह समझाने की परवाह करना कि आपको मेरी प्रतिक्रिया के बारे में क्या पसंद नहीं है?
ब्योर्न केचल

क्या GetTheme () को गतिविधि में, या संबंधित फ़्रैगमेंट में ओवरराइड किया जाना चाहिए? मैंने इसे गतिविधि में लागू किया है, लेकिन अभी भी मूल गतिविधि विषय का उपयोग कर रहे हैं।
साल्टएंडपेपर

@saltandpepper इसे गतिविधि में ओवरराइड करना पर्याप्त है। सुनिश्चित करें कि आपका टुकड़ा कोड और लेआउट इसे फिर से नहीं बदलते हैं।
ब्योर्न केचल

यह मेरे लिए काम नहीं किया, लेकिन जवाब stackoverflow.com/a/15496425/494179 में प्रदान किया।
साल्टएंडपीपर

2
अच्छा बिंदु user1269737 ताकि आपको यह सुनिश्चित करना चाहिए कि कोई भारी गणना नहीं है। बस एक साधारण स्थिति के मामले में शैली लौटाने से प्रदर्शन प्रभावित नहीं होगा।
ब्योर्न केचेल

12

मुझे पता है कि मुझे देर हो गई है लेकिन मैं यहां एक समाधान पोस्ट करना चाहूंगा: यहां
पूर्ण स्रोत कोड की जांच करें
यह वह कोड है जिसका उपयोग मैंने वरीयताओं का उपयोग करते हुए थीम बदलते समय किया था।

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);

}

कृपया ध्यान दें कि आपको सेट-कॉन्टिन्यूव्यू से पहले कोड डालना होगा।

खुश कोडिंग!


क्यों? जवाब है corect ?!
डोंडोंडॉन

मैं थीम को बचाने के लिए साझा प्राथमिकता का उपयोग करता हूं, लेकिन ऐप को पुनरारंभ करते समय, एक पल के लिए पहला विषय दिखाई देता है, फिर दूसरा विषय दिखाया गया है!
मोहम्मद अफशरत

0

यह मेरे लिए ठीक काम करता है:

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)
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.