簡體   English   中英

為什么在不同的主題中創建不同的按鈕?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM