为Android中的所有editTexts设置一致的主题

时间:2013-07-15 05:55:26

标签: android android-edittext android-theme android-styles

我已经完成了我的应用程序。现在,我想重置所有的editTexts,使布局宽度为填充父级而不是换行内容。

android:layout_width="fill_parent"

目前所有的editTexts都是

android:layout_width="wrap_content"

我有什么方法可以在样式xml文件中执行此操作,而不是在每个布局中单独执行此操作? 我目前将此作为我的styles.xml

<style name="AppTheme" parent="android:Theme.Light">  
    <item name="android:fontFamily">Verdana</item>
    <item name="android:editTextStyle">@style/EditTextStyle</item>
</style>

<style name="EditTextStyle" parent="@android:style/Widget.EditText">
    <item name="android:layout_width">fill_parent</item>
    <item name="android:textColor">#808080</item>
</style>

但我得到一个例外,说必须指定layout_width。 这是我的例外:

07-15 11:13:34.872: E/AndroidRuntime(1195): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.passwordkeeper.ui/com.passwordkeeper.ui.ActivityLogin}: java.lang.RuntimeException: Binary XML file line #29: You must supply a layout_width attribute.

任何简单的方法或者我必须单独更改所有editText中的属性吗?

7 个答案:

答案 0 :(得分:4)

你可以尝试这个。 以下是您需要更改以调用自定义主题的清单文件的一部分(此处调用的自定义主题是AppTheme:

<application android:name="YourApplication"
android:theme="@style/AppTheme" >

然后在您的文件styles.xml中,创建并自定义此自定义主题:

<style name="AppTheme" parent="@android:style/Theme.Holo.Light">
 <item name="android:typeface">YourTypeFace</item>
</style>

您可以在样式中添加所需的参数。这会将样式应用于所有文本视图。

答案 1 :(得分:2)

您的问题的一个解决方案是将自定义主题应用于您的所有活动。为此,您可以从现有主题继承属性并覆盖要更改的属性。

  1. 在AndroidManifest.xml中,找到&lt; application&gt;元件。
  2. 将属性添加到其中:
  3.   

    机器人:主题=&#34; @style /&#34;

    1. 在values文件夹中找到styles.xml文件。
    2. 使用以下模板:
    3. <style name="ApplicationStyle" parent="android:Theme.Light">
          <item name="@android:editTextStyle">@style/customEditText</item>"
      </style>
      

      上面使用的名称只是示例,您可以使用自己的名称。至于父主题,这也取决于你。

      剩下的就是editTextStyle的定义(或者您为样式选择的任何名称)。您应该从Widget.EditText继承属性并覆盖要更改的属性,如下所示:

      <style name="customEditText" parent="@android:style/Widget.EditText">
          <item name="android:textColor" >#ffffff</item>
      </style>
      

      To quote the official android guide:

        

      元素中的parent属性是可选的并指定   此样式应从其继承的另一种样式的资源ID   属性。然后,您可以覆盖继承的样式属性if   你想要。

      我试图让它易于理解和遵循。我是一名初级开发人员,所以当上述解决方案适合我时,它可能不是那里最好的解决方案。正如我所说,它可以相当有效地解决问题。

答案 2 :(得分:2)

我遇到了这个问题。出于某种原因,它帮助我将android:部分放在AppTheme定义中,并将其仅保留为editTextStyle(如this answer中所述):

<style name="AppTheme" parent="android:Theme.Light"> 
    <item name="android:fontFamily">Verdana</item>
    <item name="editTextStyle">@style/EditTextStyle</item>
</style>

答案 3 :(得分:1)

不幸的是,无法从主题设置布局属性(layout_ *)(请参阅Layout Parameters documentationthis answer from an Android framework engineer)。您必须在每个元素上设置它们或在样式中设置布局属性,并让每个元素引用这样的样式:

<Button style="@style/ButtonBig" android:text="my text" />

其中ButtonBig的定义如下:

<style name="ButtonBig" parent="android:Widget.Holo.Light.Button">
    <item name="android:textSize">20sp</item>
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">100dp</item>        
</style>

答案 4 :(得分:0)

您必须将属性style="@styles/EditTextStyle"设置为应用程序中的所有EditText组件。

答案 5 :(得分:0)

为所有EditText定义样式属性,如下所示:

   <EditText
    android:id="@+id/editText1"
    android:layout_height="wrap_content"
    style="@style/EditTextStyle">

答案 6 :(得分:0)

您必须分别为每个视图指定layout_width。没有办法逃脱。您可以创建一个LayoutParams对象并在其中设置其宽度和高度,并在每个EditText中设置它,如

textView1.setLayoutParams(lParams);
textView2.setLayoutParams(lParams);
...