2012-12-25 16 views
8

में सही टेक्स्ट रंग/उपस्थिति मैं काफी लंबे समय तक इस समस्या के साथ संघर्ष कर रहा हूं। मैंने समाधान की खोज की और वास्तव में संबंधित समस्याओं के लिए कुछ सुझाव थे, लेकिन वास्तव में मेरे लिए कुछ भी सही ढंग से काम नहीं किया। तो मान लें कि मैं एक (लंबा) संदेश, एक चेकबॉक्स और दो बटन के साथ एक अलर्टडिअलॉग बनाना चाहता हूं।अलर्टडिअलॉग

// create dialog 
AlertDialog.Builder dlg = new AlertDialog.Builder(this); 
dlg.setTitle(R.string.dlg_title); 
dlg.setMessage(R.string.dlg_msg); 

// add checkbox 
final CheckBox checkbox = new CheckBox(this); 
dlg.setView(checkbox); 

// add buttons 
dlg.setPositiveButton(...); 
dlg.setNegativeButton(...); 

// show dialog 
dlg.show(); 

यह काम नहीं करेगा, क्योंकि अगर संवाद संदेश बहुत लंबा हो जाता है, चेकबॉक्स पूरी तरह से नहीं दिखाया जाएगा। इसके अतिरिक्त, यह लैंडस्केप मोड में पूरी तरह छुपा जा रहा है।

अगला प्रयास original dialog layout file (मेरे लिए यह एंड्रॉइड-एसडीके-लिनक्स_86/प्लेटफॉर्म/एंड्रॉइड -17/डेटा/रेस/लेआउट/alert_dialog.xml) के अंतर्गत स्थित है और बनाने के लिए प्रासंगिक भाग की प्रतिलिपि बनाने का प्रयास करेगा हमारे अपने भीतर संवाद लेआउट की "क्लोन", बस इस तरह:

dialog_checkbox.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:orientation="vertical" > 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:overScrollMode="ifContentScrolls" 
     android:paddingBottom="12dip" 
     android:paddingLeft="14dip" 
     android:paddingRight="10dip" 
     android:paddingTop="2dip" > 

     <TextView 
      android:id="@+id/message" 
      style="?android:attr/textAppearanceMedium" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:padding="5dip" /> 
    </ScrollView> 

    <CheckBox 
     android:id="@+id/checkbox" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</LinearLayout> 

हम इस तरह हमारे संवाद करने के लिए इस दृश्य जोड़ने के लिए कोशिश कर सकते:

// create dialog 
AlertDialog.Builder dlg = new AlertDialog.Builder(this); 
dlg.setTitle(R.string.dlg_title); 

// add checkbox 
LinearLayout checkboxLayout = (LinearLayout) View.inflate(mContext, R.layout.dialog_checkbox, null); 
((TextView) checkboxLayout.findViewById(R.id.message)).setText(R.string.dlg_msg); 
mCheckbox = (CheckBox) checkboxLayout.findViewById(R.id.checkbox); 
mCheckbox.setText(R.string.dlg_checkbox_msg); 
setView(checkboxLayout); 

// add buttons 
dlg.setPositiveButton(...); 
dlg.setNegativeButton(...); 

// show dialog 
dlg.show(); 

यह वास्तव में काफी अच्छी तरह से काम करता है। लगभग। जब तक हम थीम का उपयोग नहीं करेंगे तब तक हमें कोई समस्या नहीं दिखाई देगी। हमारे ऐप के लिए लाइट। लेकिन जैसे ही हम थीम का उपयोग करते हैं। लाइट, डायलॉग टेक्स्ट रंग काले रंग की पृष्ठभूमि पर काले और अपठनीय हो जाएंगे। क्यों ?!

  • हमने मूल एंड्रॉइड अलर्ट संवाद xml लेआउट स्रोत कोड को क्लोन कर दिया है। लेकिन हालांकि हम टेक्स्ट शैली के रूप में attr/textAppearanceMedium का उपयोग करते हैं, फिर भी टेक्स्ट रंग थीम के नीचे काला हो जाता है। वैसे भी।
  • यदि हम थीम.लाइट का उपयोग करते हैं और setMessage के माध्यम से सामान्य संदेश के साथ "सामान्य" संवाद बनाते हैं, तो टेक्स्ट रंग सफेद और पठनीय होता है।

क्या गलत है? इसे कैसे हल करें? मैं प्रोग्राम को रंग या सफेद रंग या काले रंग में सेट नहीं करना चाहता, यह कस्टम उपयोगकर्ता विषयों पर अच्छा नहीं लगेगा। कोई सुझाव?

उत्तर

0

बस के अंदर TextView एक विशेषता जोड़ें:

android:textColor="@color/white" 

और colors.xml जो अंदर रेस है अंदर सफेद रंग को परिभाषित/

<color name="white">#ffffff</color> 

महत्व देता फ़ोल्डर या आप सीधे

android:textColor="#fffff" जोड़ सकते हैं (हालांकि अनुशंसित नहीं है। विधि विधि की सिफारिश की है।)

+0

जैसा कि कहा गया है, मैं इस समाधान को पसंद नहीं करता हूं। क्या, अगर कोई कस्टम थीम का उपयोग करता है, जहां संवाद में हल्की पृष्ठभूमि और एक गहरा पाठ रंग होता है? उन्हें तब समस्याएं होने वाली हैं। यह समाधान मेरी राय में बिल्कुल साफ नहीं है। – flxapps

+0

नहीं, आप इसे आजमा सकते हैं क्योंकि यदि आप टेक्स्ट रंग सफेद को स्पष्ट रूप से देंगे, तो यह किसी भी थीम के डिफ़ॉल्ट रंग को ओवरराइड करेगा। –

+0

आपको समझ में नहीं आता है। कुछ एंड्रॉइड उपयोगकर्ताओं के पास कस्टम रोम हैं और उनमें से कुछ कस्टम रोम व्यक्तिगत रूप से थीम्ड हैं। और उनमें से कुछ व्यक्तिगत विषयों में बहुत उज्ज्वल रंग हो सकते हैं। और उनमें से कुछ चमकदार रंगीन विषयों में चमकदार संवाद पृष्ठभूमि हो सकती है। और वे थीम जिनके पास उज्ज्वल संवाद पृष्ठभूमि हैं, वे संवाद टेक्स्ट को पठनीय बनाने के लिए तर्कसंगत रूप से काले रंग के रंगों का उपयोग करेंगे। और अगर मैं सफेद रंग के साथ इस पाठ रंग को ओवरराइड करता हूं, तो चमकदार पृष्ठभूमि पर दिखाया गया सफेद टेक्स्ट होगा। क्या आप एक सफेद पृष्ठभूमि पर सफेद पाठ पढ़ने में सक्षम होंगे? मुझे ऐसा नहीं लगता ... – flxapps

0

आप अपने पाठ दृश्यमान बनाने के लिए एक छाया के साथ एक कस्टम शैली आवेदन कर सकते हैं जो कुछ भी पाठ का रंग है:

<resources> 
<style name="Text.Shaded.Medium" parent="@android:attr/textAppearanceMedium"> 
    <item name="@android:paddingLeft">4dp</item> 
    <item name="@android:paddingBottom">4dp</item> 
    <item name="@android:textColor">#FFFFFFFF</item> 
    <item name="@android:shadowColor">#000000</item> 
    <item name="@android:shadowDx">2</item> 
    <item name="@android:shadowDy">2</item> 
    <item name="@android:shadowRadius">2</item> 
</style> 
</resources> 

हालांकि अगर यह आप के लिए आप कर सकते हैं पर्याप्त नहीं दिखाई देता है एक आंतरिक छाया लागू करें, लेकिन दुर्भाग्यवश एंड्रॉइड के पास इसके लिए कोई संपत्ति नहीं है, इसलिए आपको MagicTextView (ABentSpoon द्वारा इस प्रश्न में उल्लिखित) का उपयोग करना होगा: Is there a way to add inner shadow to a TextView on Android?)।

+1

यह समाधान डिफ़ॉल्ट संवाद देखने के साथ भी गड़बड़ करता है। यह संवाद उपस्थिति उपयोगकर्ता के लिए असामान्य और अजीब बनाता है। मुझे ऐसा समाधान पसंद नहीं है। – flxapps

1

I THINK मुझे अंत में पता चला कि इसे कैसे हल किया जाए।

// add checkbox layout 
LinearLayout checkboxLayout = (LinearLayout) View.inflate(new ContextThemeWrapper(context, android.R.style.Theme_Dialog), R.layout.dialog_checkbox, null); 
((TextView) checkboxLayout.findViewById(R.id.message)).setText(DIALOG_TEXT); 
mCheckbox = (CheckBox) checkboxLayout.findViewById(R.id.checkbox); 
mCheckbox.setText(CHECKBOX_NOT_AGAIN); 
setView(checkboxLayout); 

नोट ContextThemeWrapper: मेरे प्रारंभिक कोड के आधार पर, यह मेरी समस्या का समाधान करने लगता है। यह बनाता है कि संवाद विषय फुलाए गए लेआउट को सौंपा गया है। मुझे आशा है कि यह अंततः भविष्य के लिए उस समस्या को हल करेगा।

+0

नहीं। ऐसा लगता है कि यह एंड्रॉइड 4 पर काम नहीं करता है ... Goddamn। क्या कोई भी उचित समाधान ढूंढ सकता है? – flxapps

19

मैं एक ही समस्या थी और मेरे वांछित संवाद विषय के लिए एक ContextThemeWrapper बनाने के द्वारा इसे हल है और इस के लिए इस्तेमाल किया AlertDialog बिल्डर बनाते समय और जब बढ़ा-चढ़ाकर संलग्न करने के लिए देखें:

ContextThemeWrapper wrapper = new ContextThemeWrapper(this, R.style.DialogBaseTheme); 
AlertDialog.Builder builder = new AlertDialog.Builder(wrapper); 
View view = LayoutInflater.from(wrapper).inflate(R.layout.create_warning, null); 
builder.setView(view); 

शैली R.style। ऊपर की ओर Holo विषय का उपयोग करने के हनीकोम्ब के लिए

<style name="DialogBaseTheme" parent="android:Theme.Dialog"/> 

तो यह भी "/values-v11/styles.xml" में परिभाषित किया गया है और: DialogBaseTheme जिंजरब्रेड के लिए और नीचे के रूप में "/values/styles.xml" में परिभाषित किया गया है के रूप में:

<style name="DialogBaseTheme" parent="android:Theme.Holo.Light.Dialog" /> 

तो जिंजरब्रेड पर मेरा कस्टम व्यू टेक्स्टव्यू स्वचालित रूप से रंगीन सफेद और हनीकॉम्ब + होलो लाइट के लिए स्वचालित रूप से रंगीन रंग होते हैं।

+2

मैंने हमेशा सोचा है कि यह कैसे करें। यह पूरी तरह से काम करता है। – nlawson

+0

इस उत्तर के लिए आपको बहुत बहुत धन्यवाद! अच्छी तरह से काम! –

संबंधित मुद्दे