একটি টুকরা জন্য থিম সেট করুন


117

আমি একটি টুকরা জন্য থিম সেট করার চেষ্টা করছি।

ম্যানিফেস্টে থিম সেট করা কার্যকর হয় না:

android:theme="@android:style/Theme.Holo.Light"

পূর্ববর্তী ব্লগগুলি দেখে, এটি মনে হয় যেন আমার একটি ContextThemeWrapper ব্যবহার করতে হয়। কেউ আমাকে কোডেড উদাহরণে উল্লেখ করতে পারেন? আমি কিছুই খুঁজে পাচ্ছি না।

উত্তর:


187

ম্যানিফেস্টে থিম সেট করা সাধারণত ক্রিয়াকলাপের জন্য ব্যবহৃত হয়।

আপনি যদি টুকরোটির জন্য থিম সেট করতে চান তবে টুকরাটির অনক্রিটভিউ () -র পরবর্তী কোড যুক্ত করুন:

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

30
এটি আমার পক্ষে কাজ করে না। খণ্ডটির এখনও একই থিম রয়েছে যা ম্যানিফেস্ট ফাইলটিতে নির্দিষ্ট করা আছে।
জিওর্জি

1
ম্যানিফেস্টে আপনি ক্রিয়াকলাপের জন্য থিম নির্দিষ্ট করেছেন, খণ্ডটি নয়। আপনি কি টুকরা বা খণ্ডের ক্রিয়াকলাপ ব্যবহার করছেন?
ডেভিড

1
আমার জন্য কাজ করেছেন। কার্যকলাপের মধ্যে ক্লাসিক টুকরা সহ।
ডেভিড

8
@ ডেভিড "ম্যানিফেস্টে থিম সেট করা ক্রিয়াকলাপের জন্য ব্যবহৃত হয়"। এই সম্পূর্ণ সত্য নয়। আপনি রানটাইমে আপনার টুকরো যোগ করার জন্য যদি একটি ফ্র্যাগমেন্টট্রান্সঅ্যাকশন ব্যবহার করেন তবে সেই থিমটি ফ্রেগমেন্টগুলিতেও প্রয়োগ করা হবে।
সেবাসস্টার

4
এটি অ্যাকশনবারার্লক লাইব্রেরি থেকে কোনও শার্লকফ্র্যাগমেন্ট কার্যকলাপের জন্য কাজ করছে বলে মনে হয় না।
toobsco42

18

টুকরাটি তার ক্রিয়াকলাপ থেকে থিম নেয়। প্রতিটি খণ্ড ক্রিয়াকলাপের থিম নির্ধারণ করে যেখানে এটি বিদ্যমান।

থিমটি ফ্র্যাগমেন্ট.অনক্রিয়েটভিউ পদ্ধতিতে প্রয়োগ করা হয়, যেখানে আপনার কোডটি দর্শন তৈরি করে, যা প্রকৃতপক্ষে যেখানে থিম ব্যবহৃত হয় objects

ফ্রেগমেন্ট.অনক্রিয়েটভিউতে আপনি লেআউটইনফ্লেটার প্যারামিটার পান যা ভিউগুলিকে স্ফীত করে এবং এটি থিমের জন্য ব্যবহৃত কনটেক্সট ধারণ করে, আসলে এটি ক্রিয়াকলাপ। সুতরাং আপনার স্ফীত দর্শনগুলি ক্রিয়াকলাপের থিমটি ব্যবহার করে।

থিমটিকে ওভাররাইড করতে, আপনি লেআউটইনফ্লেটার.ক্লোনআইনকন্টেক্সট কল করতে পারেন , যা ডক্সে উল্লেখ করেছে যে এটি থিম পরিবর্তনের জন্য ব্যবহার করা যেতে পারে। আপনি এখানে ContextThemeWrapper ব্যবহার করতে পারেন। তারপরে খণ্ডের দর্শন তৈরি করতে ক্লোনযুক্ত ইনফ্ল্যাটার ব্যবহার করুন।


গুগল ডক্সে যেমন বলা হয়েছে: "... প্রদত্ত প্রসঙ্গের সাথে যুক্ত নতুন লেআউটআইনফ্লেটার অবজেক্টটি একটি ব্র্যান্ড ফিরিয়ে দেয় ..." - ডেভেলপার.অ্যান্ড্রয়েড
ক্রিস

ডেভিড কোড সমাধানে খুব সহায়ক সংযোজন। ধন্যবাদ!
মুটিজেনফ্লো

13

একক স্টাইল প্রয়োগ করার জন্য আমি কেবল ব্যবহার করেছি

getContext().getTheme().applyStyle(styleId, true);

মধ্যে onCreateView()টুকরা এর আগে টুকরা মূল দৃশ্য বৃদ্ধি এবং এটা আমার জন্য কাজ করে।


1
মিনিট এপিআই 23 এর জন্যgetContext()
চৌকস

@vigilancer আপনার সর্বনিম্ন API সমস্যাটিকে একটি ফিক্স জন্য এই উত্তর চেক করুন: stackoverflow.com/questions/36736244/...
rm8x

1
দুর্দান্ত সমাধান। আমি অনাটাচ (প্রসঙ্গ) এ কোডটি যুক্ত করেছি যা সমস্ত শিশু খণ্ডের থিমও প্রয়োগ করে
crysxd

এটি প্রাসঙ্গিক (বেশিরভাগ ক্ষেত্রে কার্যকলাপ) থিমটি সংশোধন করে বলে এর অপ্রত্যাশিত পরিণতি হতে পারে। ক্রিয়াকলাপের ভবিষ্যতের স্ফীতকরণ (উদাহরণস্বরূপ,
ঘোরার

12

আমি আমার খণ্ডটির কথোপকথনটি এর ক্রিয়াকলাপে আলাদা থিম সহ প্রদর্শিত করার চেষ্টা করছিলাম এবং এই সমাধানটি অনুসরণ করেছি । মন্তব্যে উল্লিখিত কিছু লোকের মতো আমিও এটি কাজ করতে পারছিলাম না এবং ডায়ালগটি ম্যানিফেস্টে নির্দিষ্ট থিমের সাথে প্রদর্শন করে চলেছিল। সমস্যা প্রমাণিত যে আমি কথোপকথন ব্যবহার করে তৈরী করতে লাগলেন হতে AlertDialog.Builderমধ্যে onCreateDialogপদ্ধতি এবং তাই ব্যবহার করা হয় নি onCreateViewযেমন উত্তর আমি লিঙ্ক দেখানো পদ্ধতি। এবং যখন আমি তাত্ক্ষণিকভাবে AlertDialog.Builderব্যবহার করছি getActivity()তখন যখন আমি ততক্ষণে তাত্ক্ষণিক ব্যবহার করা উচিত ছিল তখন ব্যবহার করে প্রসঙ্গে যাচ্ছিলাম ConstextThemeWrapper

আমার অনক্রিয়েট ডায়ালগের কোড এখানে:

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

এই পরিবর্তনের পরে খণ্ড সংলাপটি সঠিক থিম সহ প্রদর্শিত হয়েছিল shown সুতরাং অন্য কারও যদি একইরকম সমস্যা হয় এবং AlertDialog.Builderতখন নির্মাতার কাছে প্রসঙ্গটি প্রেরণ করা হচ্ছে তা পরীক্ষা করে দেখুন। আশাকরি এটা সাহায্য করবে! :)


9

আপনি android:minSdkVersion="11"আপনার ম্যানিফেস্টে সেট করেছেন তা নিশ্চিত করুন । ডেভিডের উদাহরণটি আপনার পক্ষে কাজ না করার কারণ এটি হতে পারে ।

এছাড়াও, সেট android:theme="@android:style/Theme.Holo.Light"জন্য গুণাবলীর <application>ট্যাগ এবং না<activity> ট্যাগ।

আর একটি সম্ভাব্য সমস্যা হতে পারে আপনি যখন ব্যবহার করছেন তখন আপনার প্রসঙ্গটি পান ContextThemeWrapper()। আপনি যদি কিছু ব্যবহার getActivity().getApplicationContext()করেন তবে getActivity()পরিবর্তে এটি প্রতিস্থাপন করুন।

সাধারণত, থিম.হোলের মেইনএ্যাকটিভিটির সাথে লিঙ্কযুক্ত টুকরাগুলিতে প্রয়োগ করা উচিত।

অনুগ্রহ করে নোট করুন যে আপনি যখন নিজের টুকরাটির জন্য আলাদা থিম প্রয়োগ করতে চান তখন আপনি একটি ContextThemeWrapper ব্যবহার করেন । আপনি যদি আপনার মেইনএকটিভিটি থেকে আপনার টুকরো যোগ করেন তবে কোডের টুকরো সরবরাহ করলে এটি সহায়তা করতে পারে।


কিছু দরকারী লিঙ্ক:

খণ্ডের কাস্টম তালিকাগুলি পিতামাত থিম মেনে চলেন না


8

ডেভিড যে সমাধানটি কাজ করেছিল তা সব পরিস্থিতিতে নয় বলে সমাধান করার চেষ্টা করেছি:
1 প্রথম স্তরের জন্য স্ট্যাক যুক্ত হওয়া ক্রিয়াকলাপের মূল প্রতিপাদ্য রয়েছে এবং অনক্রেটভিউতে সংজ্ঞায়িত নয়, তবে দ্বিতীয় খণ্ডে স্ট্যাকের সাথে যোগ করুন তাদের খণ্ডটিতে প্রয়োগ করা হয়েছে।

২. দ্বিতীয় খণ্ডে যেগুলি সেগুলি সঠিকভাবে প্রদর্শিত হয়েছিল, আমি নিম্নলিখিতটি করেছি আমি মেমরিটি পরিষ্কার করে অ্যাপটি বন্ধ করতে বাধ্য করেছিলাম, অ্যাপটি আবার খুলি এবং যখন ক্রিয়াকলাপটি খণ্ড দিয়ে পুনরায় তৈরি করা হয়েছিল তখন খণ্ডটি তাদের ভুল করে দিয়েছে ক্রিয়াকলাপ এবং খণ্ডটির অনক্রিটভিউতে সেট করা একই রকম নয়।

সমস্যাটি সমাধানের জন্য আমি একটি ছোট পরিবর্তন করেছি এবং inflater.inflate থেকে ধারক যুক্তিটি একটি নাল দিয়ে প্রতিস্থাপন করেছি।

আমি জানি না যে পাত্রটি কনটেইনার ভিউ থেকে প্রেক্ষাপটে কিছু পরিস্থিতিতে ব্যবহার করে।

দ্রষ্টব্য - যে আমি 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);
} 

ধন্যবাদ, আপনার সমাধান আমাকে বাঁচায়। আমার ডায়ালগফ্রেগমেন্টের থিমটি অন্য খণ্ডগুলির চেয়ে কিছুটা আলাদা ছিল। এটি আমার এডিটেক্সটকে অদ্ভুত করে তুলেছে কারণ আমি প্রদত্ত ইনফ্লেটার ব্যবহার করেছি। আমি ContextThemeWrapper সম্পর্কিত কিছু সহায়তা পেয়েছি কিন্তু তারা কীভাবে এটি সম্পাদিত হয় তা দেখায় নি। আপনার সমাধান আমার জন্য কাজ করে। অনেক ধন্যবাদ.
ফুওং দাও

4

আমি এটি কিছুটা দেরিতে জানি তবে এটি অন্য কাউকে সাহায্য করতে পারে কারণ এটি আমাকে সাহায্য করেছে You আপনি খণ্ডের অনক্রেটভিউ ফাংশনের অভ্যন্তরে নীচের কোডের লাইনটি যুক্ত করার চেষ্টা করতে পারেন

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

2

একটি জাভা ক্লাস তৈরি করুন এবং তারপরে আপনি অনক্রিট পদ্ধতিতে থিমটি পরিবর্তন করতে চান লেআউটটি ব্যবহার করুন hen তারপরে এটি স্বাভাবিক হিসাবে ম্যানিফেস্টে উল্লেখ করুন


1

যদি আপনি কেবলমাত্র নির্দিষ্ট খণ্ডের জন্য স্টাইল প্রয়োগ করতে চান তবে কেবল কল করার আগে onCreateView()বা খণ্ডটির আগে এই লাইনগুলি যুক্ত করুন onAttach(),

getActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
getActivity().getWindow().setStatusBarColor(Color.TRANSPARENT);

এবং আপনি স্বচ্ছ স্ট্যাটাস বার সেট করতে চান তাহলে সেট মিথ্যা থেকে fitsSystemWindowsআপনার রুট লেআউট সম্পত্তি,

android:fitsSystemWindows="false"

1

আমি স্ফীতকে কল করার আগে খণ্ড প্রসঙ্গে থিমটি সেট করে কাজ করতে পেরেছি।

দ্রষ্টব্য: এমভিভিএমক্রসের সাথে মিলিয়ে এটি জামারিন অ্যান্ড্রয়েডের জন্য একটি উদাহরণ। এটি জাভা প্রোগ্রামারদের জন্যও কাজ করবে কিনা আমি 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;
}

সেটটাইম এক্সটেনশন পদ্ধতি কোড

public static void SetTheme(this Context context, AppThemeStyle themeStyle)
{
    var themeStyleResId = themeStyle == AppThemeStyle.Dark ? Resource.Style.AppTheme : Resource.Style.AppTheme_Light;

    context.SetTheme(themeStyleResId);
}

আমি আশা করি এটি কিছু লোককে সাহায্য করবে, চিয়ার্স!


1

আমি 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>

-1

আপনি অনাচাতে ললিপপের জন্য এটি ব্যবহার করে দেখতে পারেন

চূড়ান্ত উইন্ডো উইন্ডো = गतिविधि.getWindow (); window.setStatusBarColor (myStatusBarColor)

এবং অনডেটটাচে এটিকে ডিফল্টরূপে ফিরে সেট করুন

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