【问题标题】:Can Android Studio Automatically Extract References From a Layout XML file into the Activity java file?Android Studio 可以自动将 Layout XML 文件中的引用提取到 Activity java 文件中吗?
【发布时间】:2014-07-25 19:59:17
【问题描述】:

过去,MotoDev Studio(基于 Eclipse,由 Motorolla 推出)具有将 XML 中的引用提取到代码中的功能。带有 ADT 的标准 Eclipse 没有此功能,但想知道它是否可以在 Android Studio 中实现。

例如给定 XML:

<Button
    android:id="@+id/my_button">

它将在您的活动类中生成:

private Button mMyButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    mMyButton = (Button) findViewById(R.id.my_button);
}

【问题讨论】:

    标签: java android xml eclipse android-studio


    【解决方案1】:

    Android Studio 有一个名为ButterKnifeZelezny 的插件,它提供您请求的功能,但前提是您使用的是ButterKnife。您可以选择要导入的内容等等。

    【讨论】:

    • 可惜目前与 AS 2.2.2 不兼容
    • 当有 40 个 -50 个字段时,它很好,但在 oncreate 方法顶部有很多代码令人困惑
    • @VishalPatel 如果您想访问所有这些字段,您别无选择。
    【解决方案2】:

    答案是合格的“是”,从 Marshmallow 开始,然后回到 Gingerbread 及其兼容性库,Android 现在有 data binding。它不会像这样提取引用,但它几乎可以满足您的需求。

    所以现在代替

    <LinearLayout …>
        <TextView android:id="@+id/name"/>
        <TextView android:id="@+id/lastName"/>
    </LinearLayout>
    

    我们有

    <LinearLayout …>
        <TextView android:text="@{user.name}"/>
        <TextView android:text="@{user.lastName}"/>
    </LinearLayout>
    

    而不是让这个 java 代码带有无关的样板代码

    private TextView mName
    protected void onCreate(Bundle savedInstanceState) {
      setContentView(R.layout.activity_main);
      mName = (TextView) findViewById(R.id.name);
      mLastName = (TextView) findViewById(R.id.lastName);
    }
    public void updateUI(User user) {
      if (user == null) {
        mName.setText(null);
        mLastName.setText(null);
      } else {
        mName.setText(user.getName());
        mLastName.setText(user.getLastName());
      }
    }
    

    我们现在有了(比 Butterknife 在其 updateUI 方法中所做的更进一步)

    private ActivityMainBinding mBinding;
    protected void onCreate(Bundle savedInstanceState) {
      mBinding = DataBindingUtil.setContentView(this,
                               R.layout.activity_main);
    }
    
    public void updateUI(User user) {
      mBinding.setUser(user);
    }
    

    而且改进还不止于此,所以我建议您查看以下由 Google 工程师 George Mount 和 Yigit Boyar 提供的presentation

    通过它进行投资非常值得。所有这些都是在编译时完成的,因此不会产生运行时损失。就像我一开始说的,它向后兼容到 Android 2.3,所以真的没有理由不使用这个新功能。

    【讨论】:

      【解决方案3】:

      你可以看看 ButterKnife。它并不完全符合您的要求,但它摆脱了很多样板。 @zigi 的解决方案似乎导入了所有在现实世界中不是很好的东西!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-17
        • 2010-09-11
        • 1970-01-01
        • 2011-03-18
        • 1970-01-01
        • 2018-04-12
        • 1970-01-01
        • 2019-05-12
        相关资源
        最近更新 更多