当前位置: 首页 > 知识库问答 >
问题:

如何更改片段中单个视图的样式

谭高峯
2023-03-14

目标:我试图在一个片段中应用两个不同的主题。一个用于片段的整体xml,另一个用于片段xml中的特定视图。

原因/问题:这是因为似乎不可能使用MaterialComponents将浮动操作按钮的整个背景更改为向量,但它确实适用于appCompat。

最初,我试图使用style="..."更改xml中的主题,如下所示,但它似乎正在恢复到清单中声明的主题AppTheme1。我知道这一点,因为我通过切换在那里声明的主题来测试它。也就是说,当我将其切换到AppTheme2时,向量在FAB中正确加载,但它在其他地方崩溃,因为我在整个应用程序中都有MaterialComponents。

解决方案:我认为最明显的解决方案是改变主题,只改变有问题的浮动动作按钮,但我不知道怎么做。非常感谢您的帮助。非常感谢。

         <com.google.android.material.floatingactionbutton.FloatingActionButton
                android:id="@+id/nationality"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_margin="10dp"
                android:scaleType="fitXY"
                app:srcCompat="@drawable/flag_united_states_of_america"
                app:borderWidth="0dp"
                style="@style/AppTheme2"
                app:maxImageSize="56dp" />

主题:

<style name="AppTheme1"  parent="Theme.MaterialComponents.Light.NoActionBar" >
<style name="AppTheme2"  parent="Theme.AppCompat.Light.NoActionBar" >

使用MaterialComponents:

使用AppCompat:

显示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.fabtest">

    <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/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

因此,当主题从AppCompat更改为Material Components时,图像资源不再正确应用于浮动操作按钮。所以我只想将AppCompat应用于浮动动作按钮,但保留材质组件作为主要样式。

共有3个答案

宣滨海
2023-03-14

Ben P.和加布里埃尔都是半正确的。答案需要通过以下方式改变主题:

android:theme="@style/SecondTheme"

并将色调设置为空:

app:tint="@null"

在这种情况下,两者都是必需的

总的来说,给定两个主题,如果您想将整个背景更改为向量,而主主题是应用程序清单中引用的MaterialComponents,那么这是FloatingActionButton的正确XML:

<com.google.android.material.floatingactionbutton.FloatingActionButton
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_margin="10dp"
          app:borderWidth="0dp"

          app:srcCompat="@drawable/your_vector"
          app:tint="@null"
          android:theme="@style/SecondTheme"
          app:maxImageSize="56dp" />

感谢加布里埃尔和本的帮助!

洪飞鸿
2023-03-14

如果你想改变按钮的主题,这会影响按钮的膨胀方式,你应该使用android:theme,而不是android:style

冀弘济
2023-03-14

在您的情况下,您可以使用:

<com.google.android.material.floatingactionbutton.FloatingActionButton
    app:tint="@null"
    app:srcCompat="@drawable/flag_united_states_of_america"
    ..>

Material Components中的FloatingActionButton使用应用程序主题中定义colorOnSecondary属性为其图标着色(默认值为#000000)。如果你不想给图标着色,你必须使用app:tint=“@null”

一般来说,如果您想在工厂中使用自定义样式,可以使用:

  <com.google.android.material.floatingactionbutton.FloatingActionButton
      style="@style/MyCustomFab"
      ..>

与:

   <style name="MyCustomFab" parent="@style/Widget.MaterialComponents.FloatingActionButton>
      .....
      <item name="backgroundTint">@color/....</item>
      <item name="tint">@color/....</item>
   </style>

如果要覆盖应用程序主题中定义的属性,可以使用:

  <com.google.android.material.floatingactionbutton.FloatingActionButton
      android:theme="@style/fab_themeoverlay"
      ..>

与:

   <style name="fab_themeoverlay" parent="@style/Widget.MaterialComponents.FloatingActionButton>
      <item name="colorPrimary">@color/...</item>
   </style>
 类似资料:
  • 我有一个包含例如一个按钮的片段,我想允许包含该片段的活动更改此按钮视图,例如颜色和标题或src图像。最好的方法是什么? 更新:如果我不够清楚,很抱歉,但我希望活动可以随心所欲地更改整个视图,比如设置填充、颜色或任何东西。它将以编程方式创建视图,片段应该用新视图替换旧视图,并更改视图的ID,以便片段代码不受影响。如果我在片段中创建了获取这些视图的方法,那么主活动应该在什么时候调用它们?因为活动必须等

  • 我需要将数组中的值替换为。尝试此操作时,仅显示阵列中的第一条记录。 如何显示数组中的所有条目?

  • 如何在成功提交数据时将数据从本地数据库刷新到RecyclerView?我使用应用程序上的选项卡。函数提交数据,如果成功,数据将存储在中。 关于的数据将在中显示。但是发生的情况是,我必须滑动,然后滑动到,然后滑动到我的上成功显示的新的数据。 主要活动: 一切都很顺利,只是希望表单提交的时候数据能显示出来,可以直接在第3页签上查看

  • 问题内容: 我想打开jpeg图像文件,对其进行编码,更改一些像素颜色,然后将其保存回原样。 我想做这样的事情 我只是想不出一个可行的解决方案,因为编码图像文件后获得的默认图像类型没有Set方法。 谁能解释该怎么做?非常感谢。 问题答案: 成功解码后(以及特定的解码功能,如),返回的值。是一个接口,用于定义图像的只读视图:它不提供更改/绘制图像的方法。 该软件包提供了几种实现方式,这些实现方式通常允

  • 我找不到如何从< code>Activity更改fragment的< code>textview。我有4个文件: frag_class.xml有textView,我想更改MainActivity.java的文本。FragmentClass扩展了片段,此片段显示在MainActivity中,FragmentClass具有: 在MainActivity中,我尝试了这个: 但可悲的是,这段代码给了我Nu

  • 我有一个显示列表的导航抽屉和一个显示内容的视页。当单击导航抽屉上列表中的特定项目时,将为所有页面生成一个URL,该URL将导致视图分页程序内容的更改。导航抽屉和查看页处于相同的活动中。view pager中的片段具有从服务器检索内容的URL。我怎样才能找到它? 下面是一些代码: 查看页有三页。适配器如下: 这些页面都有一个URL字段,用于从包含数据的服务器中提取json。所以简而言之,问题是当导航