ক্রিয়াকলাপের থিমটি প্রোগ্রামগতভাবে পরিবর্তন করুন


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 এর সাথে মোটোগে (ভি 1) আমার জন্য কাজ করে। যদি এটি আপনার পক্ষে কাজ করে না তবে দয়া করে ডিভাইস + অ্যান্ড্রয়েড সংস্করণ ভাগ করুন।
lenrok258

আমাকে এখানে বর্ণিত থিমটি সংজ্ঞায়িত করতে হয়েছিল: stackoverflow.com/a/44236460/3211335 এবং তারপরে এটিকে উত্তর হিসাবে বর্ণিত হিসাবে সেট করুন। এটি দুর্দান্ত কাজ করে।
লালালোপ

যাইহোক আমরা কী কেবল একবার থিম সেট করতে পারি ... প্রতি পৃষ্ঠায় সেট থিমের পরিবর্তে
gayan1991

আমি থিম সংরক্ষণ করতে ভাগ করে নেওয়া পছন্দ ব্যবহার করি তবে অ্যাপটি পুনরায় চালু করার সাথে সাথে এক মুহুর্তের জন্য প্রথম থিম প্রদর্শিত হবে তারপরে দ্বিতীয় থিম দেখানো হবে!
মোহাম্মদ আফরাশতেহ

1
@ gayan1991 আপনি আপনার থিমটি সংজ্ঞায়িত করতে এবং আপনার অন্যান্য সমস্ত ক্রিয়াকলাপগুলি এটির প্রসারিত করতে অন্য একটি ক্রিয়াকলাপ ব্যবহার করতে পারেন: পেস্টবিন.
com

46

ব্যবহারকারীর ১৪6২২৯৯ এর প্রতিক্রিয়া দুর্দান্ত কাজ করে তবে আপনি যদি টুকরো টুকরো অন্তর্ভুক্ত করেন তবে তারা আসল ক্রিয়াকলাপের থিমটি ব্যবহার করবে। সমস্ত টুকরোতে থিম প্রয়োগ করতে পাশাপাশি পরিবর্তিত প্রবন্ধের 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;
}

অনক্রিট () পদ্ধতিতে আপনাকে আর সেটটেম () কল করার দরকার নেই। আপনি এই প্রসঙ্গে এই প্রসঙ্গে বর্তমান থিমটি পেতে প্রতিটি অনুরোধ ওভাররাইড করছেন।


2
@ যারাই হ্রাস পেয়েছে: আমার প্রতিক্রিয়া সম্পর্কে আপনি কী পছন্দ করেন না তা ব্যাখ্যা করার জন্য যত্নশীল?
বিজরন কেচেল

GetTheme () ক্রিয়াকলাপে বা স্বতন্ত্র খণ্ডগুলিতে ওভাররাইড করা উচিত? আমি এটি কার্যকলাপে প্রয়োগ করেছি, তবে খণ্ডগুলি এখনও মূল ক্রিয়াকলাপ থিমটি ব্যবহার করছে।
সালটানপেপার

ক্রিয়াকলাপে সলান্ট্পেপার এটি ওভাররাইড করা যথেষ্ট। আপনার খন্ডের কোড এবং লেআউটটি আর পরিবর্তন না করে তা নিশ্চিত করুন।
বিজয়ন কেচেল

এটি আমার পক্ষে কাজ করেনি, তবে স্ট্যাকওভারফ্লো . com/a/15496425/494179 এ দেওয়া উত্তরটি করেছে।
সালটান্পেপ্পার

2
ভাল পয়েন্ট ব্যবহারকারী 1269737 সুতরাং আপনার কোনও ভারী গণনা নেই তা নিশ্চিত হওয়া উচিত। কেবলমাত্র একটি সাধারণ শর্তের ক্ষেত্রে কোনও শৈলী ফিরিয়ে দেওয়া কার্য সম্পাদনকে প্রভাবিত করবে না।
বিজার্ন কেচেল

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

}

দয়া করে মনে রাখবেন যে সেট কোড কনটভিউয়ের আগে আপনাকে কোডটি রাখতে হবে ..

শুভ কোডিং!


কেন? উত্তর কোর্ট ?!
ডনডোন্ড

আমি থিম সংরক্ষণ করতে ভাগ করে নেওয়া পছন্দ ব্যবহার করি তবে অ্যাপটি পুনরায় চালু করার সাথে সাথে এক মুহুর্তের জন্য প্রথম থিম প্রদর্শিত হবে তারপরে দ্বিতীয় থিম দেখানো হবে!
মোহাম্মদ আফরাশতাহ

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)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.