programing

setTag() getTag() View 메서드의 주요 목적은 무엇입니까?

starjava 2023. 6. 21. 22:01
반응형

setTag() getTag() View 메서드의 주요 목적은 무엇입니까?

다음과 같은 방법의 주요 목적은 무엇입니까?setTag()그리고.getTag()View유형 객체?

여러 개체를 단일 보기에 연결할 수 있다고 생각하는 것이 맞나요?

유사한 뷰를 여러 개 생성한다고 가정해 보겠습니다.설정할 수 있습니다.OnClickListener각 뷰에 대해 개별적으로:

button1.setOnClickListener(new OnClickListener ... );
button2.setOnClickListener(new OnClickListener ... );
 ...

그런 다음 고유한 정보를 생성해야 합니다.onClick다음과 같은 유사한 작업을 수행하는 경우에도 각 보기에 대한 방법을 지정할 수 있습니다.

public void onClick(View v) {
    doAction(1); // 1 for button1, 2 for button2, etc.
}

그 이유는onClick매개 변수는 하나뿐입니다.View또한 인스턴스 변수 또는 범위를 둘러싸는 최종 로컬 변수에서 다른 정보를 가져와야 합니다.우리가 정말 원하는 것은 뷰 자체에서 정보를 얻는 것입니다.

를 입력하십시오.getTag/setTag:

button1.setTag(1);
button2.setTag(2);

이제 모든 버튼에 대해 동일한 OnClick Listener를 사용할 수 있습니다.

listener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        doAction(v.getTag());
    }
};

그것은 기본적으로 관점이 기억을 갖는 방법입니다.

몇 마디 덧붙이고 싶습니다.

사용하기는 하지만get/setTag(Object)보기의 특정한 경우에 매우 유용한 것 같습니다.홀더 패턴, 다른 경우에 사용하기 전에 두 번 생각해 보는 것이 좋습니다.거의 항상 더 나은 디자인의 다른 솔루션이 있습니다.

주된 이유는 그러한 코드가 매우 빠르게 지원되지 않기 때문입니다.

  • 보기에 태그로 저장하도록 설계한 내용이 다른 개발자에게는 분명하지 않습니다.방법들setTag/getTag전혀 설명이 되지 않습니다.

  • 저장할 뿐입니다.Object당신이 원할 때 캐스팅되어야 하는 것.getTag나중에 태그에 저장된 개체의 유형을 변경하기로 결정하면 예기치 않은 충돌이 발생할 수 있습니다.

  • 여기 실제 이야기가 있습니다.우리는 많은 어댑터, 뷰가 있는 비동기 작업 등으로 꽤 큰 프로젝트를 수행했습니다.한 개발자는 다음과 같이 결정했습니다.set/getTag다른 코드가 이미 태그를 이 보기로 설정했습니다.결국, 누군가는 자신의 꼬리표를 찾지 못했고 매우 혼란스러워 했습니다.우리가 그 벌레를 찾는데 몇 시간이 걸렸습니다.

setTag(int key, Object tag)(ID 리소스를 사용하여) 모든 태그에 대해 고유한 키를 생성할 수 있기 때문에 훨씬 좋아 보이지만, Android < 4.0에는 상당한 제한이 있습니다.린트 문서에서:

Android 4.0 이전 버전에서는 View.setTag(int, Object)를 구현하면 개체가 정적 맵에 저장되며, 여기서 값이 강하게 참조됩니다.즉, 개체에 컨텍스트를 가리키는 참조가 포함되어 있으면 컨텍스트(다른 모든 항목을 가리키는)가 누출됩니다.뷰를 전달하면 뷰는 뷰를 작성한 컨텍스트에 대한 참조를 제공합니다.마찬가지로 뷰 홀더에는 일반적으로 뷰가 포함되며 커서가 뷰와 연결되는 경우도 있습니다.

우리는 사용할 수 있습니다.setTag()그리고.getTag()요구 사항에 따라 사용자 지정 개체를 설정하고 가져옵니다.setTag()의 인수를 합니다.Object,그리고.getTag()을 합니다.Object.

예를들면,

Person p = new Person();
p.setName("Ramkailash");
p.setId(2000001);
button1.setTag(p);

웹 개발자들에게 이것은 데이터와 동등한 것으로 보입니다.

은 사용자 지정 ▁custom에 매우 합니다.ArrayAdapter사용합니다. 일종의 최적화입니다. 기거.setTag레이아웃의 일부에서 참조하는 객체에 대한 참조로 사용됩니다(표시되는 객체).ListView findViewById.

static class ViewHolder {
    TextView tvPost;
    TextView tvDate;
    ImageView thumb;
}

public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
        LayoutInflater inflater = myContext.getLayoutInflater();
        convertView = inflater.inflate(R.layout.postitem, null);

        ViewHolder vh = new ViewHolder();
        vh.tvPost = (TextView)convertView.findViewById(R.id.postTitleLabel);
        vh.tvDate = (TextView)convertView.findViewById(R.id.postDateLabel);
        vh.thumb = (ImageView)convertView.findViewById(R.id.postThumb);
        convertView.setTag(vh);
    }
            ....................
}

ID와 달리 태그는 보기를 식별하는 데 사용되지 않습니다.태그는 기본적으로 보기와 연결할 수 있는 추가 정보입니다.뷰는 뷰 자체에 관련된 데이터를 별도의 구조로 배치하는 것이 아니라 뷰 자체에 저장하기 위한 편리한 용도로 사용되는 경우가 많습니다.

참조: http://developer.android.com/reference/android/view/View.html

태그 설정은 목록 보기가 있고 보기를 재활용/재사용하려는 경우에 매우 유용합니다.이러한 방식으로 ListView는 새로운 RecyclerView와 매우 유사해지고 있습니다.

@Override
public View getView(int position, View convertView, ViewGroup parent)
  {
ViewHolder holder = null;

if ( convertView == null )
{
    /* There is no view at this position, we create a new one. 
       In this case by inflating an xml layout */
    convertView = mInflater.inflate(R.layout.listview_item, null);  
    holder = new ViewHolder();
    holder.toggleOk = (ToggleButton) convertView.findViewById( R.id.togOk );
    convertView.setTag (holder);
}
else
{
    /* We recycle a View that already exists */
    holder = (ViewHolder) convertView.getTag ();
}

// Once we have a reference to the View we are returning, we set its values.

// Here is where you should set the ToggleButton value for this item!!!

holder.toggleOk.setChecked( mToggles.get( position ) );

return convertView;
}

언급URL : https://stackoverflow.com/questions/5291726/what-is-the-main-purpose-of-settag-gettag-methods-of-view

반응형