NUmeroAndDev / Knowledge

0 stars 0 forks source link

ViewBinding #3

Open NUmeroAndDev opened 5 years ago

NUmeroAndDev commented 5 years ago

Link

https://developer.android.com/topic/libraries/view-binding

NUmeroAndDev commented 5 years ago

ViewBinding を使うメリット

DataBinding との違い

ViewBinding は Binding の仕組みがない。
ViewBinding はただ View を提供するだけ。

使い道

findViewById を置き換える場合に使う。
Kotlin Android Extensions を使ってる場合に、id がそのまま参照する変数名になっていたため、ViewBinding を使えば Snake な id でもきちんと Camel な変数に変えてくれる。

問題点

一部のライブラリ(ex.groupie)がサポートできていない。
Activity のコンストラクタ(AppCompatActivity(R.layout.hogehoge))に渡せない。

NUmeroAndDev commented 5 years ago

生成されるコード

public final class ActivityVideoDetailBinding implements ViewBinding {
  @NonNull
  private final CoordinatorLayout rootView;

  @NonNull
  public final FrameLayout detailContainer;

  @NonNull
  public final FrameLayout playerContainer;

  private ActivityVideoDetailBinding(@NonNull CoordinatorLayout rootView,
      @NonNull FrameLayout detailContainer, @NonNull FrameLayout playerContainer) {
    this.rootView = rootView;
    this.detailContainer = detailContainer;
    this.playerContainer = playerContainer;
  }

  @Override
  @NonNull
  public CoordinatorLayout getRoot() {
    return rootView;
  }

  @NonNull
  public static ActivityVideoDetailBinding inflate(@NonNull LayoutInflater inflater) {
    return inflate(inflater, null, false);
  }

  @NonNull
  public static ActivityVideoDetailBinding inflate(@NonNull LayoutInflater inflater,
      @Nullable ViewGroup parent, boolean attachToParent) {
    View root = inflater.inflate(R.layout.activity_video_detail, parent, false);
    if (attachToParent) {
      parent.addView(root);
    }
    return bind(root);
  }

  @NonNull
  public static ActivityVideoDetailBinding bind(@NonNull View rootView) {
    // The body of this method is generated in a way you would not otherwise write.
    // This is done to optimize the compiled bytecode for size and performance.
    String missingId;
    missingId: {
      FrameLayout detailContainer = rootView.findViewById(R.id.detailContainer);
      if (detailContainer == null) {
        missingId = "detailContainer";
        break missingId;
      }
      FrameLayout playerContainer = rootView.findViewById(R.id.playerContainer);
      if (playerContainer == null) {
        missingId = "playerContainer";
        break missingId;
      }
      return new ActivityVideoDetailBinding((CoordinatorLayout) rootView, detailContainer,
          playerContainer);
    }
    throw new NullPointerException("Missing required view with ID: ".concat(missingId));
  }
}

ただ、findViewById して変数として保持