[英]Why in different themes different buttons are created?
我有一個常用的按鈕和一個應用於android:theme
AndroidManifest
文件中的主題:
<Button
android:id="@+id/supperButton"
android:layout_width="match_parent"
android:layout_height="120dp" />
<style name="AppTheme" parent="Theme.AppCompat">
</style>
當我打開此按鈕並使用調試器停止應用程序以查看已創建的 class 時,我看到以下內容:
如您所見,創建了 AppCompatButton,而不是通常的按鈕AppComapatButton
。 當我將主題更改為如下時:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
</style>
創建了MaterialButton
,而不是通常的按鈕 class 或AppComapatButton
:
問題:據我所知,主題可以定義所使用的小部件的確切類型。 那么究竟是什么定義了它呢? 也許主題中有一些屬性可以做到這一點?
如果您的Activity
擴展了AppCompatActivity
,就會發生這種情況。
AppCompatActivity
使用 LayoutInflater 的自定義實現調用setFactory2
方法。
此實現由AppCompatViewInflater
完成,它檢查布局中視圖的名稱,並自動“替換”核心 Android 小部件的所有使用,這些小部件從布局文件中通過這些小部件的 AppCompat 擴展擴展。
您可以查看源代碼:
@Nullable
public final View createView(/**...*/) {
//...
switch (name) {
case "Button":
view = createButton(context, attrs);
verifyNotNull(view, name);
break;
//...
}
@NonNull
protected AppCompatButton createButton(Context context, AttributeSet attrs) {
return new AppCompatButton(context, attrs);
}
在 MaterialComponents 主題中定義了另一個實現,即MaterialComponentsViewInflater
。
例如,您可以查看源代碼:
@Override
protected AppCompatButton createButton(@NonNull Context context, @NonNull AttributeSet attrs) {
return new MaterialButton(context, attrs);
}
您可以使用自己的 inflater 在應用程序主題中添加viewInflaterClass
屬性:
<style name="Theme.App" parent="Theme.MaterialComponents.*">
<item name="viewInflaterClass">com.google.android.material.theme.MaterialComponentsViewInflater</item>
</style>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.