मटेरियलकंप्यूटर थीम अलर्ट डायलॉग बटन


83

हाल ही में मैंने सपोर्ट लाइब्रेरी से कॉम .google.android.material पर स्विच किया: सामग्री: 1.0.0

लेकिन अब मुझे एक समस्या है, इस पृष्ठों में एक नोट है https://github.com/material-compenders/material-compenders-android/blob/master/docs/getting-started.md

नोट: सामग्री घटक विषय का उपयोग करने से एक कस्टम व्यू इनफ़ॉटर सक्षम होता है जो डिफ़ॉल्ट घटकों को उनके सामग्री समकक्षों के साथ बदल देता है। वर्तमान में, यह केवल सामग्री XML के साथ बटन XML घटकों को प्रतिस्थापित करता है।

और जो विषय मैं उपयोग कर रहा हूं

Theme.MaterialComponents.Light.NoActionBar

उस नोट में वास्तव में यह क्या कहता है, यह AlertDialog Buttons को MaterialButtons की जगह देता है, लेकिन समस्या यह है कि डिफ़ॉल्ट रूप से MaterialButtons रंगीन पृष्ठभूमि हैं और अब बटन इस तरह दिखते हैं: यहाँ छवि विवरण दर्ज करें

मैं उन्हें फिर से सीमाहीन और पृष्ठभूमिविहीन कैसे बना सकता हूं?

PS मैं सतर्क संवाद बनाने के लिए सतर्क बिल्डर का उपयोग कर रहा हूं:

android.app.AlertDialog.Builder

यदि आप कुछ नई सामग्री UI शैलियों के साथ AppCompat विषय सामग्री चाहते हैं, तो आप ब्रिज थीम का उपयोग कर सकते हैं, यह आपकी समस्या को हल कर सकता है, मेरे इस जवाब को देखें: stackoverflow.com/a/52401497/10271334
जिल वानखेड़े

जवाबों:


114

मुझे लगा कि यह समस्या क्या है। मुझे अलग-अलग AlertDialog क्लास का उपयोग करने की आवश्यकता है:

androidx.appcompat.app.AlertDialog

जब मैंने इस पर स्विच किया तो सब कुछ उम्मीद के मुताबिक काम करने लगा। यहाँ मैं समाधान पाया है:

https://github.com/material-compenders/material-compenders-android/issues/162


2
मैंने एंड्रॉइड स्टूडियो के 'माइग्रेट टू एंड्रॉएडएक्स' विकल्प / सुविधा का उपयोग करके एंड्रॉइड पर अपना कोड माइग्रेट किया था लेकिन यह लाइब्रेरी स्वचालित रूप से एंड्रॉइड एक्स के लिए अपडेट नहीं की गई थी। मेरे लिए यह मुद्दा हल हो गया था जब मैंने मैन्युअल रूप से आयात को अद्यतन किया था जैसा कि उत्तर से पता चलता है
sushrut619

1
आप मुझे बचा लीजिए! धन्यवाद!
मटुस

सभी हीरोज टोपी नहीं पहनते हैं!
ओ 'ग्रांडी

आधी रात से पहले एक बड़ा धन्यवाद। आपने मुझे एक घंटे की नींद से बचाया।
नांटोका

76

का उपयोग करते समय com.google.android.material:material:1.0.0और androidx.appcompat.app.AlertDialogआप माता-पिता के रूप में buttonBarउपयोग करके प्रत्येक बटन को अनुकूलित कर सकते हैं Widget.MaterialComponents.Button.TextButton

val builder: AlertDialog.Builder = AlertDialog.Builder(ContextThemeWrapper(context, R.style.AlertDialogTheme))

डिफ़ॉल्ट लेआउट का उपयोग करें या द्वारा एक कस्टम जोड़ें builder.setView(R.layout.my_dialog)

आपकी शैलियों में:

<style name="AlertDialogTheme" parent="Theme.MaterialComponents.Light.Dialog.Alert">
    <item name="buttonBarPositiveButtonStyle">@style/Alert.Button.Positive</item>
    <item name="buttonBarNegativeButtonStyle">@style/Alert.Button.Neutral</item>
    <item name="buttonBarNeutralButtonStyle">@style/Alert.Button.Neutral</item>
</style>

<style name="Alert.Button.Positive" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="backgroundTint">@color/transparent</item>
    <item name="rippleColor">@color/colorAccent</item>
    <item name="android:textColor">@color/colorPrimary</item>
    <item name="android:textSize">14sp</item>
    <item name="android:textAllCaps">false</item>
</style>

<style name="Alert.Button.Neutral" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="backgroundTint">@color/transparent</item>
    <item name="rippleColor">@color/colorAccent</item>
    <item name="android:textColor">@color/gray_dark</item>
    <item name="android:textSize">14sp</item>
</style>

स्क्रीनशॉट


1
यह वही है जो मैं अपने संवादों को स्टाइल करने की कोशिश कर रहा था। मुझे मिले सभी उत्तर AndroidX का उपयोग नहीं कर रहे थे।
लियोनार्डो

2
मुझे यकीन नहीं है कि आप textAllCaps को गलत क्यों सेट कर रहे हैं। मैं आमतौर पर इसे डायलॉग्स पर सच करने के लिए सेट करता हूं (एकमात्र अपवाद क्रेन नामक Google से एक सामग्री डिजाइन उदाहरण था)
लियोनार्डो

5
काश मैं इसे 50 बार बढ़ा पाता। मैंने दो घंटे ऐसे बिताए जैसे सिर्फ बेवकूफाना डायलॉग लिखने की कोशिश कर रहा हो। ध्यान दें कि आपको MaterialAlertDialogBuilderइसके बजाय भी उपयोग करना चाहिए ।
gMale

1
@gMale की टिप्पणी ने मेरे लिए समय बचाया।
फंक्शनल 7

1
धन्यवाद यह वास्तव में मदद की!
ग्रिस्ग्राम

21

यदि आप सामग्री अवयव पुस्तकालय का उपयोग करने के लिए सबसे अच्छा तरीका AlertDialogहै का उपयोग कर रहे हैं MaterialAlertDialogBuilder

new MaterialAlertDialogBuilder(context)
            .setTitle("Dialog")
            .setMessage("Lorem ipsum dolor ....")
            .setPositiveButton("Ok", /* listener = */ null)
            .setNegativeButton("Cancel", /* listener = */ null)
            .show();

यह डिफ़ॉल्ट परिणाम है:

यहाँ छवि विवरण दर्ज करें

यदि आप बटन के लिए एक अलग शैली या रंग भी लागू करना चाहते हैं, तो आप इस उत्तर की जांच कर सकते हैं ।


के AlertDialog.Builderसाथ MaterialAlertDialogBuilderबदलने से बटन का रंग नहीं बदला। बदलने के लिए नीचे दिए गए उत्तर देखें theme
कूलमाइंड

@CoolMind सवाल यह नहीं है कि बटन का रंग कैसे बदला जाए।
गैब्रिएल मारीओटी

13

मैंने उपरोक्त उत्तरों का परीक्षण किया। हालांकि मुझे एक अच्छा विचार मिला, किसी ने भी मेरे मामले के लिए काम नहीं किया। तो, यह मेरा जवाब है।

  1. android:theme="@style/AppMaterialTheme"एप्लिकेशन या गतिविधि के तहत अपनी मैनिफ़ेस्ट फ़ाइल में होना सुनिश्चित करें ।

  2. अपनी Styles.xml फ़ाइल खोलें और निम्न के आधार पर इसे बदलें।

    <style name="AppMaterialTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <item name="colorPrimary">@color/primaryBlue</item>
        <item name="colorPrimaryDark">@color/primaryBlue</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="colorControlActivated">@color/primaryBlue</item>
        <item name="colorControlHighlight">@color/colorAccent_main</item>
        <item name="colorButtonNormal">@color/white</item>
    
        <item name="materialAlertDialogTheme">@style/AlertDialogMaterialTheme</item>
    </style>
    
    <style name="AlertDialogMaterialTheme" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog">
        <item name="buttonBarPositiveButtonStyle">@style/Alert.Button.Positive</item>
        <item name="buttonBarNegativeButtonStyle">@style/Alert.Button.Negative</item>
    </style>
    
    <style name="Alert.Button.Positive" parent="Widget.MaterialComponents.Button.UnelevatedButton">
        <item name="android:fillColor">@color/color_0054BB</item>
        <item name="android:textColor">@color/white</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:textSize">14sp</item>
        <item name="rippleColor">@color/colorAccent_main</item>
    </style>
    
    <style name="Alert.Button.Negative" parent="Widget.MaterialComponents.Button.OutlinedButton">
        <item name="strokeColor">@color/color_0054BB</item>
        <item name="android:textColor">@color/color_0054BB</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:textSize">14sp</item>
        <item name="android:layout_marginEnd">8dp</item>
        <item name="rippleColor">@color/colorAccent_main</item>
    </style>
    

  3. जैसा कि आपकी गतिविधि उस पर विषय लागू करती है, आपको अपने अलर्ट पर थीम लागू करने की आवश्यकता नहीं होगी। इसलिए, सामान्य रूप से संवाद बनाएं।

यहाँ छवि विवरण दर्ज करें

परिणाम होगा।

यहाँ छवि विवरण दर्ज करें


मुझे नहीं पता कि क्यों, "buttonBarPositiveButtonStyle" मेरे लिए काम नहीं कर रहा है, लेकिन "android: buttonBarPositiveButtonStyle" ठीक से काम कर रहा है।
लुकाज़टार्ज़ास्का

स्टाइल पॉजिटिवबटन पर लागू नहीं हो रहा है। नेगेटिव वाला वही।
लुकाज़ताराज़का

11

सबसे पहले, MaterialAlertDialog का उपयोग करना बेहतर हैयदि आप सामग्री थीम का उपयोग कर रहे हैं ।

आप यहां और अधिक पढ़ सकते हैं - Material.io → थिमिंग डायलॉग्स

यहाँ छवि विवरण दर्ज करें

MaterialAlertDialogBuilder(context)
            .setTitle(R.string.confirm)
            .setMessage(R.string.logout)
            .setPositiveButton(R.string.logout_alert_positive) { _, _ -> activity?.logout() }
            .setNegativeButton(R.string.never_mind, null)
            .show()

 

यह MaterialAlertDialog क्रियाओं का लेआउट। Xml है। जैसा कि आप देख सकते हैं कि 3 बटन हैं और प्रत्येक की अपनी शैली है। तो, यहां बताया गया है कि आप उन्हें कैसे बदल सकते हैं।

चरण 1: Android को बताएं कि आप डिफ़ॉल्ट MaterialAlertDialog थीम को बदलना चाहते हैं ।

<style name="Base.AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    ...
    <item name="materialAlertDialogTheme">@style/AlertDialog</item>
    ...
</style>

चरण 2: Android को बताएं कि आप एक विशिष्ट बटन शैली को बदलना चाहते हैं। buttonBarNeutralButtonStyle, buttonBarNegativeButtonStyleयाbuttonBarPositiveButtonStyle

<style name="AlertDialog" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog">
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
</style>

चरण 3: अपनी कस्टम शैली को परिभाषित करें

<style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="android:textColor">#FF0000</item>
</style>

6

इसके लिए सामग्रीकॉमर्स का उपयोग करने के साथ यहां एक और समाधान मिला: https://issuetracker.google.com/issues/116861837#com99

<style name="Theme.Custom.Material.Alert.Dialog.Light" parent="Theme.MaterialComponents.Light.Dialog.Alert">
    <item name="materialButtonStyle">@style/Widget.AppCompat.Button.Borderless</item>
</style>

<style name="Theme.Custom.Material.Base.Light" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="android:dialogTheme">@style/Theme.Custom.Material.Alert.Dialog.Light</item>
    <item name="android:alertDialogTheme">@style/Theme.Custom.Material.Alert.Dialog.Light</item>
  ....
</style>

हालांकि यह अभी भी मेरे लिए "अभिप्रेत व्यवहार" नहीं है।


5

यदि आप उपयोग नहीं करना चाहते हैं androidx.appcompat.app.AlertDialog , तो आप संवाद बटन की शैली को फिर से परिभाषित कर सकते हैं:

अपनी शैली में। Xml:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
   ...
   <item name="android:buttonBarButtonStyle">@style/DialogButton</item>
   ...
</style>

<style name="DialogButton" parent="Widget.MaterialComponents.Button.TextButton"/>


4

यदि आप com.android.support:design:28.0.0पुस्तकालय का उपयोग कर रहे हैं , तो android.support.v7.app.AlertDialogअपेक्षा के अनुसार काम करता है।

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