एक टुकड़ा के लिए विषय सेट करें


117

मैं एक खंड के लिए विषय निर्धारित करने की कोशिश कर रहा हूँ।

मैनिफ़ेस्ट में थीम सेट करना काम नहीं करता है:

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

पिछले ब्लॉगों को देखने से, ऐसा प्रतीत होता है जैसे मुझे एक ContextThemeWrapper का उपयोग करना है। क्या कोई मुझे एक कोडित उदाहरण के लिए संदर्भित कर सकता है? मुझे कुछ नहीं मिल रहा है।

जवाबों:


187

मेनिफ़ेस्ट में थीम सेट करना आमतौर पर गतिविधि के लिए उपयोग किया जाता है।

यदि आप 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);
}

30
यह मेरे लिए काम नहीं करता है। टुकड़े में अभी भी वही थीम है जो मैनिफ़ेस्ट फ़ाइल में निर्दिष्ट है।
गियोर्गी

1
मैनिफ़ेस्ट में आप गतिविधि के लिए थीम निर्दिष्ट करते हैं, खंड नहीं। क्या आप खंड या अंश का उपयोग कर रहे हैं?
डेविड

1
मेरे लिए काम किया। गतिविधि के भीतर क्लासिक फ्रैगमेंट के साथ।
डेविड

8
@ डेविड "मेनिफेस्ट में सेटिंग थीम का उपयोग गतिविधि के लिए किया जाता है"। यह पूरी तरह से सच नहीं है। यदि आप क्रम में अपने Fragment को जोड़ने के लिए एक FragmentTransaction का उपयोग करते हैं तो वह विषय Fragments पर भी लागू होता है।
सीबस्टर

4
यह ActionBarSherlock लाइब्रेरी से एक SherlockFragmentActivity के लिए काम नहीं करता है।
टॉब्स्को 42

18

फ्रैगमेंट इसकी गतिविधि से इसकी थीम लेता है। प्रत्येक खंड को उस गतिविधि की थीम सौंपी जाती है जिसमें यह मौजूद है।

विषय को Fragment.onCreateView पद्धति में लागू किया जाता है, जहां आपका कोड दृश्य बनाता है, जो वास्तव में ऑब्जेक्ट हैं जहां थीम का उपयोग किया जाता है।

Fragment.onCreateView में आपको LayoutInflater पैरामीटर मिलता है, जो विचारों को फुलाता है, और यह थीम के लिए उपयोग किया जाने वाला संदर्भ रखता है, वास्तव में यह गतिविधि है। तो आपके फुलाए हुए विचार गतिविधि के विषय का उपयोग करते हैं।

विषय को ओवरराइड करने के लिए, आप LayoutInflater.cloneInContext को कॉल कर सकते हैं , जिसमें डॉक्स में उल्लेख किया गया है कि इसका उपयोग थीम बदलने के लिए किया जा सकता है। आप यहां ContextThemeWrapper का उपयोग कर सकते हैं। तब खंड के विचारों को बनाने के लिए क्लोन किए गए इनफ़्लोटर का उपयोग करें।


जैसा कि Google डॉक्स यह बताता है: "... दिए गए संदर्भ के साथ जुड़ा हुआ नया LayoutInflater ऑब्जेक्ट स्पैन्डिंग ब्रांड देता है ..." - developer.android.com/reference/android/view/…
क्रिस

डेविडस कोड समाधान के लिए बहुत उपयोगी इसके अलावा। धन्यवाद!
muetzenflo

13

एक ही शैली लागू करने के लिए मैंने अभी-अभी उपयोग किया है

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

में onCreateView()टुकड़ा के पहले टुकड़ा रूट दृश्य बढ़ा-चढ़ाकर और यह मेरे लिए काम करता है।


1
मिनट के लिए 23 एपीआईgetContext()
सतर्क

@vigilancer अपने min api समस्या के समाधान के लिए इस उत्तर की जाँच करें: stackoverflow.com/questions/36736244/…
rm8x

1
महान समाधान। मैंने onAttach (Context) में कोड जोड़ा, जो सभी बच्चे के टुकड़े पर विषय को लागू करता है
crysxd

यह अप्रत्याशित परिणाम हो सकता है क्योंकि यह संदर्भ (ज्यादातर मामलों में गतिविधि) विषय को संशोधित करता है। गतिविधि का एक भावी उदाहरण (उदाहरण के लिए, एक रोटेशन के बाद) हर जगह नए विषय का उपयोग करेगा
इरहाला

12

मैं अपनी गतिविधि के लिए एक अलग विषय के साथ प्रदर्शित करने के लिए अपने खंड संवाद प्राप्त करने की कोशिश कर रहा था, और इस समाधान का पालन ​​किया । टिप्पणियों में उल्लेख किए गए कुछ लोगों की तरह, मुझे यह काम करने के लिए नहीं मिल रहा था और संवाद प्रकट में निर्दिष्ट विषय के साथ दिखा रहा था। समस्या यह है कि मैं विधि 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वह बिल्डर को दिए जा रहे संदर्भ की जांच कर रहा है। उम्मीद है की यह मदद करेगा! :)


9

सुनिश्चित करें कि आपने android:minSdkVersion="11"अपने मैनिफ़ेस्ट में सेट किया है। यही कारण हो सकता है कि डेविड का उदाहरण आपके लिए काम नहीं करता।

इसके अलावा, सेट android:theme="@android:style/Theme.Holo.Light"के लिए विशेषता <application>टैग और नहीं<activity> टैग।

एक अन्य संभावित समस्या हो सकती है जिस तरह से आप अपने संदर्भ का उपयोग करते समय प्राप्त करते हैं ContextThemeWrapper()। यदि आप किसी चीज़ का उपयोग करते हैं तो उसके बजाय getActivity().getApplicationContext()इसे बदलें getActivity()

आम तौर पर, Theme.Holo को MainActivity से जुड़े Fragments पर लागू होना चाहिए।

कृपया ध्यान दें कि जब आप अपने Fragment के लिए एक अलग विषय लागू करना चाहते हैं तो आप एक ContextThemeWrapper का उपयोग करें। यदि आप अपने MainActivity से कोड के टुकड़े प्रदान करते हैं, जहां आप अपने टुकड़े जोड़ते हैं तो यह मदद कर सकता है।


कुछ उपयोगी लिंक:

मूल सूची में कस्टम सूची दृश्य का पालन नहीं


8

मैंने हल करने की कोशिश की कि डेविड ने सुझाव दिया कि यह काम करता है, लेकिन सभी परिदृश्यों में नहीं:
1. पहले टुकड़े के लिए जो स्टैक में जोड़ा गया है उसमें गतिविधि का विषय है और एक ऐसा नहीं है जो onCrateView में परिभाषित किया गया है, लेकिन दूसरा टुकड़ा है कि मैं स्टैक में जोड़ें सही उन्हें टुकड़े पर लागू किया गया था।

2. दूसरे टुकड़े पर, जो उन्हें सही तरीके से प्रदर्शित किया गया था, मैंने निम्न किया कि मैंने ऐप को मेमोरी को साफ करके बंद करने के लिए मजबूर किया, फिर से ऐप खोलें और जब गतिविधि को खंड के साथ फिर से बनाया गया था, तो टुकड़े ने उन्हें गलत तरीके से बदल दिया गतिविधि और खंड के onCrateView में सेट किया गया था कि एक ही नहीं।

इस समस्या को हल करने के लिए मैंने एक छोटा सा बदलाव किया और कंटेनर तर्क को 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);
} 

धन्यवाद, आपका समाधान मुझे बचाता है। मेरा DialogFragment का विषय अन्य टुकड़ों से कुछ अलग था। इसने मेरे EditText को अजीब बना दिया क्योंकि मैंने इनफ्लो दिया। मुझे ContextThemeWrapper के बारे में कुछ मदद मिली, लेकिन उन्होंने यह नहीं दिखाया कि यह कैसे किया जाता है। आपका समाधान मेरे लिए काम करता है। बहुत धन्यवाद।
फुओंग दाओ

4

मुझे इसकी थोड़ी देर पता है, लेकिन यह किसी और की मदद कर सकता है क्योंकि इससे मुझे मदद मिली। आप टुकड़े के onCreatView फ़ंक्शन के अंदर कोड की पंक्ति को जोड़ने का भी प्रयास कर सकते हैं

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

2

एक जावा वर्ग बनाएँ और फिर उस लेआउट का उपयोग करें जिसे आप ऑनक्रिएट विधि में थीम बदलना चाहते हैं। फिर इसे सामान्य रूप से प्रकट करें


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

मैंने इसे फुलाकर कॉल करने से पहले टुकड़े के संदर्भ में थीम सेट करके काम करने के लिए मिला है।

नोट: यह MvvmCross के साथ संयोजन में Xamarin.Android के लिए एक उदाहरण है। मुझे यकीन नहीं है कि यह जावा प्रोग्रामर के लिए भी काम करेगा। लेकिन आप प्रयास कर सकते हैं :)

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

SetTheme एक्सटेंशन विधि कोड

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

तुम onAttach में लॉलीपॉप के लिए यह कोशिश कर सकते हैं

अंतिम विंडो विंडो = activity.getWindow (); window.setStatusBarColor (myStatusBarColor)

और इसे ondettach में डिफ़ॉल्ट रूप से सेट करें

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