السمات والأساليب الروبوت دون السحر. وكيف لطهيها مع SwitchCompat


في مقال سابق ، نظرنا في كيفية استخدام السمات والأساليب على مستوى الرمز ، باستخدام طريقة العرض المخصصة كمثال. في هذه المقالة ، دعونا نلقي نظرة على عدة طرق لتصميم عنصر واجهة مستخدم قياسي ، وعلى وجه الخصوص SwitchCompat.

محتوى


مقدمة
نمط جديد ل switchStyle
نمط التخطيط
الاسلوب في الموضوع. يتم تعيين الموضوع من خلال البيان.
الاسلوب في الموضوع. يتم تعيين السمة برمجياً.
عرض آخر

مقدمة


ليس دائمًا التصميم الافتراضي لعنصر واجهة المستخدم القياسي يناسب المصمم. دعونا نلقي نظرة على كيفية تغيير مظهر عنصر باستخدام مثال SwitchCompat.

لحل المشكلة ، نحتاج إلى:

  • قم بإنشاء طريقتك الخاصة لـ SwitchCompat.
  • تعيين بطريقة ما هذا النمط SwitchCompat.

هناك عدة طرق لتعيين نمط SwitchCompat ، على سبيل المثال:

  • حدد لكل طريقة عرض في تخطيط الشاشات من خلال سمة النمط.
  • إنشاء سمة مع سمة switchStyle التي تم تجاوزها وتعيين هذا المظهر في البيان للتطبيق بأكمله أو نشاط معين. سيؤدي هذا إلى تغيير مظهر العرض للتطبيق / النشاط بأكمله.
  • يمكن أيضًا تعيين الموضوع برمجيًا في رمز التفعيل. إذا لزم الأمر ، يمكن تغييره على الطاير.

نمط جديد ل SwitchCompat




في الموارد ، قم بإنشاء نمط MySwitchStyle جديد ، ورث التصميم من Widget.AppCompat.CompoundButton.Switch عن طريق تعيين الأصل. قد لا ترث ، ولكن بعد ذلك سيتعين عليك تحديد جميع القيم ، حتى وإننا لا نخطط للتغيير.

<style name="MySwitchStyle" parent = "Widget.AppCompat.CompoundButton.Switch"> </style> 

لتغيير شيء ما ، تحتاج إلى إعادة تعريف السمات المطلوبة. يمكن العثور على السمات في الوثائق.

في الوثائق نرى العديد من السمات. تتم الإشارة إليها كما لو كنا نصل إليها في الكود (على سبيل المثال ، مثل R.styleable.SwitchCompat_android_thumb). سأقوم بفك تشفير جزء منهم حتى لا يكون هناك شك. الغرض من الباقي سهل الفهم من الوثائق.
في الرمز
في XML
SwitchCompat_android_thumb
الروبوت: الإبهام
SwitchCompat_thumbTint
thumbTint
SwitchCompat_track
تتبع
SwitchCompat_trackTint
trackTint

  • android: thumb - مورد للجزء المتحرك من SwitchCompat
  • المسار - مورد للجزء ثابت من SwitchCompat
  • thumbTint - يسمح لك برسم الجزء المتحرك بالألوان المرغوبة وفقًا لحالة SwitchCompat
  • trackTint - يسمح لك بتلوين الجزء الثابت بالألوان المطلوبة وفقًا لحالة SwitchCompat

على سبيل المثال ، قم بتغيير لون الإبهام (الدائرة) - فليكن اللون البرتقالي عندما يكون قيد التشغيل ، والأخضر عند إيقاف تشغيله. قبيح ، لكن بوضوح.

سنحتاج إلى محدد في مجلد الألوان لمواردنا. ملف selector_switch_thumb.xml

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:color = "@android:color/holo_orange_dark"/> <item android:color="@android:color/holo_green_light"/> </selector> 

الآن تعيين سمة thumbTint في أسلوبنا.

 <style name="MySwitchStyle" parent = "Widget.AppCompat.CompoundButton.Switch"> <item name="thumbTint">@color/selector_switch_thumb</item> </style> 

الآن كل أشكال SwitchCompat ، التي حصلت بطريقة ما على نمط MySwitchStyle ، ستبدو بطريقة جديدة.



نمط التخطيط


الطريقة الأكثر تافهة وغير مرنة.

  • يتم تطبيق النمط عند تضخيم مورد التخطيط.
  • لا يمكننا التأثير على البرامج بأي طريقة.
  • من غير المناسب الإشارة إلى كل مرة في التخطيط. ويمكننا أن ننسى.

 <androidx.appcompat.widget.SwitchCompat android:text="Themed switch" style="@style/MySwitchStyle" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 

الاسلوب في الموضوع. موضوع معين عن طريق البيان


إنشاء سمة AppTheme وتعيين قيمة السمة switchStyle. القيمة هي أسلوب MySwitchStyle الخاص بنا.

 <resources> <style name="CustomTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <!--    switchStyle --> <item name="switchStyle">@style/MySwitchStyle</item> </style> </resources> 

يمكن تحديد السمة في البيان للتطبيق بأكمله.

 <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/CustomTheme"><!--     --> </application> 

أو لنشاط معين

 <activity android:name=".MainActivity" android:theme="@style/CustomTheme"><!--    --> </activity> 

الآن جميع SwitchCompat سيكون لها نظرة جديدة. لا تغيير في التخطيط.

  • الايجابيات - يمكننا تغيير مظهر التطبيق بأكمله على الفور.
  • سلبيات - على الطاير لا يمكنك تغييره.

الاسلوب في الموضوع. يتم تعيين السمة برمجياً


من أجل تعيين سمة التنشيط برمجيًا ، تحتاج إلى استدعاء طريقة التنشيط setTheme (themeResId).

دعنا نغير موضوع النشاط حسب حالة التبديل.

 private const val KEY_CUSTOM_THEME_CHECKED = "KEY_CUSTOM_THEME_CHECKED" class MainActivity : AppCompatActivity() { private val preference by lazy { PreferenceManager.getDefaultSharedPreferences(this) } override fun onCreate(savedInstanceState: Bundle?) { val isCustomThemeChecked = preference.getBoolean( KEY_CUSTOM_THEME_CHECKED, true ) if (isCustomThemeChecked) { setTheme(R.style.CustomTheme) } else { setTheme(R.style.StandardTheme) } super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) customThemeCheckbox.isChecked = isCustomThemeChecked customThemeCheckbox.setOnCheckedChangeListener { _, isChecked -> preference.edit() .putBoolean(KEY_CUSTOM_THEME_CHECKED, isChecked) .apply() recreate() } } } 

  1. تثبيت السمة برمجياً عن طريق استدعاء setTheme. يجب استدعاء الأسلوب قبل super.onCreate (saveInstanceState). في onCreate ، نقوم بتهيئة الأجزاء (عندما تكون).
  2. اضبط الحالة المبدئية للتبديل حسب الموضوع.
  3. نقوم بتثبيت مستمع يقوم بتغيير السمة في الإعدادات عند تغيير المفتاح وإعادة تشغيل النشاط من خلال طريقة التنشيط إعادة إنشاء ().

يؤدي



بقية الكود
 <resources> <style name="CustomTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="switchStyle">@style/MySwitchStyle</item> </style> <style name="StandardTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> <style name="MySwitchStyle" parent="Widget.AppCompat.CompoundButton.Switch"> <item name="thumbTint">@color/selector_switch_thumb</item> </style> </resources> 

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" android:orientation="vertical"> <CheckBox android:text="CustomTheme" android:layout_width="match_parent" android:layout_height="wrap_content" android:saveEnabled="false" android:id="@+id/customThemeCheckbox"/> <androidx.appcompat.widget.SwitchCompat android:text="Themed switch" android:layout_marginTop="56dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/themedSwitch"/> </LinearLayout> 


عرض آخر


لإعادة تعريف نمط SwithView للتطبيق بأكمله ، قمنا بإعادة تعريف قيمة سمة switchStyle ، يمكننا تخمين وجود هذه السمات لطريقة العرض الأخرى.

على سبيل المثال:

  • editTextStyle
  • checkboxStyle
  • radioButtonStyle

كيف تبحث عنهم؟ أشاهد المصدر فقط من خلال Android Studio.
نذهب إلى الموضوع ، اضغط باستمرار على ctrl ، انقر فوق أصل موضوعنا. نحن ننظر في كيفية وصف اللاعبين من Google للموضوع. ننظر إلى أي سمة يتم تحديدها ومن أي أسلوب يمكننا أن نرثه. نحن نستخدمها.

قطعة من موضوع Base.V7.Theme.AppCompat.Light.

 <item name="editTextStyle">@style/Widget.AppCompat.EditText</item> <item name="checkboxStyle">@style/Widget.AppCompat.CompoundButton.CheckBox</item> <item name="radioButtonStyle"> @style/Widget.AppCompat.CompoundButton.RadioButton </item> <item name="buttonStyle">@style/Widget.AppCompat.Button</item> 

موارد


developer.android.com/guide/topics/ui/look-and-feel/themes

developer.android.com/reference/android/support/v7/widget/SwitchCompat.html#xml-attributes

PS

المقالة لا تدعي أنها مرجع كامل. رمز تقصير عمدا. قمت بتعيين المهمة لإعطاء فهم عام - كيف يعمل ولماذا هناك حاجة إليه. ثم يتم البحث عن كل شيء بسهولة في الوثائق وفي الموارد القياسية.

Source: https://habr.com/ru/post/ar456178/


All Articles