如何使用Generator修改CssResource的css文件?

时间:2014-05-09 21:51:07

标签: java javascript gwt

我正在使用GWT Generators并希望使用Generator修改css文件。 css文件包含如下所示的常量(test / client / App.css):

@def LINE_WIDTH 100px;

我定义了一个接口(test / client / DeviceDensity.java):

public interface DeviceDensity extends CssResource {

    String APP_CSS = "test/client/App.css";

}

使用gwt生成器我想将常量 LINE_WIDTH 修改为75px,100px,150px或200px;取决于属性 phone.density 的值,该属性在模块文件中定义为:

    <define-property name="phone.density" values="lpdi,mdpi,hpdi,xhdpi" />
    <property-provider name="phone.density"><![CDATA[
    {
        var ratio = window.devicePixelRatio;
        if (ratio == 0.75) { return "lpdi"; }
        else if (ratio == 1) {return "mdpi"; }
        else if (ratio == 1.5) {return "hpdi"; }
        return "xhdpi";
    }
    ]]></property-provider>

如何在生成器中获取phone.density的值?如何修改css常量LINE_WIDTH?

1 个答案:

答案 0 :(得分:0)

如何在生成器中获取phone.density的值?

可能不是你想要的那么简单,但你可以这样做:

  • 为每个电话密度值创建一个基类com.gwt.demo.client.PhoneDensity并为其创建一个子类,如下所示。

    public class PhoneDensity {}
    
    public class PhoneDensityLpdi extends PhoneDensity{}
    public class PhoneDensityMdpi extends PhoneDensity{}
    public class PhoneDensityHpdi extends PhoneDensity{}
    public class PhoneDensityXhdpi extends PhoneDensity{}
    
  • 将此添加到您的gwt.xml:

        <define-property name="density" values="lpdi,mdpi,hpdi,xhdpi" />
    
        <property-provider name="density"><![CDATA[
        {
            var ratio = window.devicePixelRatio;
            if (ratio == 0.75) { return "lpdi"; }
            else if (ratio == 1) {return "mdpi"; }
            else if (ratio == 1.5) {return "hpdi"; }
            return "xhdpi";
        }
        ]]></property-provider>
    
        <replace-with class="com.gwt.demo.client.PhoneDensityLpdi">
            <when-type-is class="com.gwt.demo.client.PhoneDensity" />
            <when-property-is name="density" value="lpdi" />
        </replace-with>
    
        <replace-with class="com.gwt.demo.client.PhoneDensityMdpi">
            <when-type-is class="com.gwt.demo.client.PhoneDensity" />
            <when-property-is name="density" value="mdpi" />
        </replace-with>
    
        <replace-with class="com.gwt.demo.client.PhoneDensityHpdi">
            <when-type-is class="com.gwt.demo.client.PhoneDensity" />
            <when-property-is name="density" value="hpdi" />
        </replace-with>
    
        <replace-with class="com.gwt.demo.client.PhoneDensityXhdpi">
            <when-type-is class="com.gwt.demo.client.PhoneDensity" />
            <when-property-is name="density" value="xhdpi" />
        </replace-with>
    
  • 在您的客户端代码中:

        // this is the magical line to read the phone density
        PhoneDensity phoneDensity = GWT.create(PhoneDensity.class);
    
        String density = null;
        if (phoneDensity instanceof PhoneDensityLpdi) {
            density = "lpdi";
        } else if (phoneDensity instanceof PhoneDensityMdpi) {
            density = "mdpi";
        } else if (phoneDensity instanceof PhoneDensityHpdi) {
            density = "hpdi";
        } else {
            density = "xhdpi";
        }
    
  

您将根据手机密度值获得PhoneDensity的实例。

  • 完成

阅读Elements for Deferred Binding部分。

有关上述方法的详细讨论,请查看以下主题


如何修改css常量LINE_WIDTH?

现在,您在客户端JAVA代码中拥有手机密度的值。将此值移至常量文件而不是css,您可以在@eval中使用UIBinder

示例代码:

<ui:style>
      @eval phoneDensity com.gwt.demo.client.Styles.INSTANCE.phoneDensity(); 
     .widget{ width: phoneDensity; }
</ui:style>    

请看下面的帖子。用一些替代解决方案解决这个问题可能会有所帮助。