수색…


소개

Butterknife는 주석을 사용하여 우리를위한 상용구 코드를 생성하는 뷰 바인딩 도구입니다. 이 도구는 Square의 Jake Wharton이 개발했으며 뷰를 처리 할 때 findViewById(R.id.view) 와 같은 반복적 인 코드 입력을 저장하는 데 기본적으로 사용되므로 코드가 훨씬 깨끗 해집니다.

명확히 말하면 Butterknife는 의존성 삽입 라이브러리아닙니다 . Butterknife는 컴파일 할 때 코드를 삽입합니다. Android Annotations에서 수행 한 작업과 매우 유사합니다.

비고

버터 칼

어노테이션 처리를 사용하여 상용구 코드를 생성하는 Android보기 용 필드 및 메소드 바인딩.

  • 필드에서 @BindView를 사용하여 findViewById 호출을 제거하십시오.
  • 목록 또는 배열에서 여러보기를 그룹화합니다. 작업, 설정자 또는 속성을 사용하여 모든 작업을 한 번에 수행하십시오.
  • @OnClick 및 기타 메소드에 주석을 달아 익명의 내부 클래스를 제거합니다.
  • 필드에서 자원 주석을 사용하여 자원 조회를 제거하십시오.

자세한 정보 : http://jakewharton.github.io/butterknife/

특허

저작권 2013 Jake Wharton

Apache 라이센스, 버전 2.0 (이하 "라이센스")에 의거하여 라이센스가 부여됩니다. 귀하는 라이센스를 준수하는 경우를 제외하고는이 파일을 사용할 수 없습니다. 귀하는 라이센스의 사본을

http://www.apache.org/licenses/LICENSE-2.0

관련법에 의해 요구되거나 서면으로 동의하지 않는 한, 라이센스에 따라 배포 된 소프트웨어는 명시 적 또는 묵시적으로 어떠한 종류의 보증이나 조건없이 "있는 그대로"의 상태로 배포됩니다. 라이선스에 따른 사용 권한 및 제한 사항을 설명하는 특정 언어에 대한 라이선스를 참조하십시오.

프로젝트에서 ButterKnife 구성하기

android-apt 플러그인을 포함하도록 프로젝트 레벨 build.gradle 을 구성하십시오.

buildscript {
   repositories {
      mavenCentral()
   }

   dependencies {
      classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
   }
}

그런 다음 모듈 수준 build.gradleandroid-apt plugin을 적용하고 ButterKnife 종속성을 추가합니다.

apply plugin: 'android-apt'

android {
    ...
}

dependencies {
      compile 'com.jakewharton:butterknife:8.5.1'
      annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}

참고 : 버전 2.2.0 이상의 새로운 Jack 컴파일러를 사용하는 경우 android-apt 플러그인이 필요하지 않으며 대신 컴파일러 종속성을 선언 할 때 apt를 annotationProcessor 바꿀 수 있습니다.

당신이 그들을 바인딩에 대해 잊지 말아야 ButterKnife 주석을 사용하려면 onCreate() 당신의 활동의 onCreateView() 당신의 조각을 :

class ExampleActivity extends Activity {

    @Override 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Binding annotations
        ButterKnife.bind(this);
        // ...
  }

}

// Or
class ExampleFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(getContentView(), container, false);
        // Binding annotations
        ButterKnife.bind(this, view);
        // ...
        return view;
  }

}

개발 버전 의 스냅 샷Sonatype의 스냅 샷 저장소 에서 사용할 수 있습니다.


다음은 라이브러리 프로젝트에서 ButterKnife를 사용하기 위해 취해야 할 추가 단계입니다.

라이브러리 프로젝트에서 ButterKnife를 사용하려면 프로젝트 레벨 build.gradle 플러그인을 추가하십시오.

buildscript {
    dependencies {
        classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
    }
}

... 그런 다음 라이브러리 레벨 build.gradle 맨 위에 다음 행을 추가하여 모듈에 적용하십시오.

apply plugin: 'com.android.library'
// ...
apply plugin: 'com.jakewharton.butterknife'

이제 모든 ButterKnife 주석 내에서 R 대신 R2 를 사용해야합니다.

class ExampleActivity extends Activity {

    // Bind xml resource to their View 
    @BindView(R2.id.user) EditText username;
    @BindView(R2.id.pass) EditText password;

    // Binding resources from drawable,strings,dimens,colors
    @BindString(R.string.choose) String choose;
    @BindDrawable(R.drawable.send) Drawable send;
    @BindColor(R.color.cyan) int cyan;
    @BindDimen(R.dimen.margin) Float generalMargin;

    // Listeners
    @OnClick(R.id.submit)
    public void submit(View view) {
    // TODO submit data to server...
    }

    // bind with butterknife in onCreate
    @Override 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        // TODO continue
  }

}

ButterKnife를 사용하여 뷰 바인딩

우리는 @BindView 와 Butter Knife의 뷰 ID로 필드에 주석을 달아 레이아웃에서 해당 뷰를 찾아 자동 캐스팅 할 수 있습니다.

바인딩 뷰

활동의 뷰 바인딩

class ExampleActivity extends Activity {
  @BindView(R.id.title) TextView title;
  @BindView(R.id.subtitle) TextView subtitle;
  @BindView(R.id.footer) TextView footer;

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.bind(this);
    // TODO Use fields...
  }
}

조각의 뷰 바인딩

public class FancyFragment extends Fragment {
  @BindView(R.id.button1) Button button1;
  @BindView(R.id.button2) Button button2;
  private Unbinder unbinder;

  @Override 
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fancy_fragment, container, false);
    unbinder = ButterKnife.bind(this, view);
    // TODO Use fields...
    return view;
  }
  
  // in fragments or non activity bindings we need to unbind the binding when view is about to be destroyed
  @Override
    public void onDestroy() {
        super.onDestroy();
        unbinder.unbind();
    }
}

대화 상자에서보기 바인딩

ButterKnife.findById 를 사용하여보기, 활동 또는 대화 상자에서보기를 찾을 수 있습니다. 제네릭을 사용하여 반환 유형을 추론하고 자동으로 캐스트를 수행합니다.

View view = LayoutInflater.from(context).inflate(R.layout.thing, null);
TextView firstName = ButterKnife.findById(view, R.id.first_name);
TextView lastName = ButterKnife.findById(view, R.id.last_name);
ImageView photo = ButterKnife.findById(view, R.id.photo);

ViewHolder의 뷰 바인딩

static class ViewHolder {
    @BindView(R.id.title) TextView name;
    @BindView(R.id.job_title) TextView jobTitle;

    public ViewHolder(View view) {
      ButterKnife.bind(this, view);
    }
  }

바인딩 리소스

바인딩 뷰에 유용함은 물론, ButterKnife를 사용하여 strings.xml , drawables.xml , colors.xml , dimens.xml 등에서 정의 된 것과 같은 리소스를 바인딩 할 수도 있습니다.

public class ExampleActivity extends Activity {

    @BindString(R.string.title) String title;
    @BindDrawable(R.drawable.graphic) Drawable graphic;
    @BindColor(R.color.red) int red; // int or ColorStateList field
    @BindDimen(R.dimen.spacer) Float spacer; // int (for pixel size) or float (for exact value) field

    @Override
    public void onCreate(Bundle savedInstanceState) {
     
        // ...

        ButterKnife.bind(this);
    }

}

보기 목록 바인딩

여러 뷰를 List 또는 배열로 그룹화 할 수 있습니다. 이는 한 번에 여러보기에서 하나의 작업을 수행해야 할 때 매우 유용합니다.

@BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name })
List<EditText> nameViews;

//The apply method allows you to act on all the views in a list at once.
ButterKnife.apply(nameViews, DISABLE);
ButterKnife.apply(nameViews, ENABLED, false);


//We can use Action and Setter interfaces allow specifying simple behavior.
static final ButterKnife.Action<View> DISABLE = new ButterKnife.Action<View>() {
  @Override public void apply(View view, int index) {
    view.setEnabled(false);
  }
};
static final ButterKnife.Setter<View, Boolean> ENABLED = new ButterKnife.Setter<View, Boolean>() {
  @Override public void set(View view, Boolean value, int index) {
    view.setEnabled(value);
  }
};

선택적 바인딩

기본적으로 @Bind 및 Listener 바인딩이 필요합니다. 타겟 뷰가 발견되지 않는 경우는 예외가 throw됩니다. 그러나 뷰가 있을지 확실하지 않은 경우 필드에 @Nullable 주석을 추가하거나 @Optional 주석을 메서드에 추가하여이 동작을 억제하고 선택적 바인딩을 만들 수 있습니다.

@Nullable 
@BindView(R.id.might_not_be_there) TextView mightNotBeThere;

@Optional 
@OnClick(R.id.maybe_missing) 
void onMaybeMissingClicked() {
  // TODO ...
}

ButterKnife를 사용하여 바인딩 청취자

OnClick Listener :

@OnClick(R.id.login)
public void login(View view) {
  // Additional logic
}

listener 메서드에 대한 모든 인수는 선택 사항입니다.

@OnClick(R.id.login)
public void login() {
   // Additional logic
}

특정 유형이 자동으로 형 변환됩니다.

@OnClick(R.id.submit)
public void sayHi(Button button) {
  button.setText("Hello!");
}

공통 이벤트 처리를위한 단일 바인딩의 다중 ID :

@OnClick({ R.id.door1, R.id.door2, R.id.door3 })
public void pickDoor(DoorView door) {
  if (door.hasPrizeBehind()) {
    Toast.makeText(this, "You win!", LENGTH_SHORT).show();
  } else {
    Toast.makeText(this, "Try again", LENGTH_SHORT).show();
  }
}

사용자 지정보기는 ID를 지정하지 않고 자체 수신기에 바인딩 할 수 있습니다.

public class CustomButton extends Button {
  @OnClick
  public void onClick() {
    // TODO 
  }
}

ButterKnife의 뷰 바인딩 해제

조각은 활동보다 뷰 수명주기가 다릅니다. onCreateView에서 단편을 바인딩 할 때 onDestroyView에서 뷰를 null로 설정하십시오. Butter Knife는 바인드를 호출 할 때 Unbinder 인스턴스를 반환합니다. 해당 수명주기 콜백에서 unbind 메소드를 호출하십시오.

예 :

public class MyFragment extends Fragment {
  @BindView(R.id.textView) TextView textView;
  @BindView(R.id.button) Button button;
  private Unbinder unbinder;

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.my_fragment, container, false);
    unbinder = ButterKnife.bind(this, view);
    // TODO Use fields...
    return view;
  }

  @Override public void onDestroyView() {
    super.onDestroyView();
    unbinder.unbind();
  }
}

참고 : onDestroyView ()에서 unbind ()를 호출하는 것은 필수 사항은 아니지만 앱에 큰 백 스택이있는 경우 메모리가 상당히 절약되므로 권장됩니다.

Android Studio 버터 나이프 플러그인

Android ButterKnife Zelezny

액티비티 / 프래그먼트 / 어댑터의 선택된 레이아웃 XML에서 ButterKnife 삽입을 생성하는 플러그인입니다.

참고 : 생성 메뉴에 Butterknife 인젝터 옵션이 포함되어 있지 않으면 your_xml_layou (R.layout.your_xml_layou )를 마우스 오른쪽 버튼으로 클릭해야합니다.

여기에 이미지 설명을 입력하십시오.

링크 : Jetbrains 플러그인 Android ButterKnife Zelezny



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow