0

Eine meiner üblichen Praxis in Android Aktivität/Fragment ist benutzerdefinierte Ansicht Halter statische Klasse in jedem Fragment/Aktivität erstellen, die nur Ansichten Referenzen enthält. Ich binde Fragment/Aktivität Blick auf diese benutzerdefinierte Ansicht Halter als Ziel mit ButterKnife. In diesem Fall funktioniert ButterKnife @OnClick Annotation nicht, da View-Referenzen in View-Holder-Klasse sind. Bitte schauen Sie sich meinen Code an.ButterKnife @OnClick für Ansichten in benutzerdefinierte Ansicht Halter Klasse

Gibt es eine Möglichkeit, dies zu überwinden, ohne meine Sichthalterklasse zu zerstören?

public class BookDetailFragment extends Fragment { 

    private ViewHolder mViewHolder; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View mFragmentView = inflater.inflate(R.layout.book_detail_view, container, false); 

     // Binding view holder 
     mViewHolder = new ViewHolder(mFragmentView); 

     return mFragmentView; 
    } 

    @OnClick (R.id.book_title) 
    public void onBookTitleClicked(TextView v) { 
     // This won't work. Is it possible to make it work with view holder class ? 
     // If I move this method into ViewHolder class I can't access fragment variables. 
    } 

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

    static class ViewHolder { 
     @BindView(R.id.book_title) TextView bookTitle; 
     @BindView(R.id.book_authors) TextView bookAuthors; 

     private Unbinder mButterKnifeUnbinder; 

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

     public void unbind() { 
      mButterKnifeUnbinder.unbind(); 
     } 
    } 
} 
+0

versuchen Sie, diese Methode in Ihre 'ViewHolder' Klasse zu verschieben. –

+0

So können Sie einfach auf die Fragmentvariable zugreifen. Ja. Dies ist möglich, indem ein Verweis auf die ViewHolder-Klasse übergeben wird, aber nach einer einfacheren Lösung gesucht wird. –

Antwort

1

nicht sicher, warum Sie dies tun wollen, aber hier ist es:

class ViewHolder { 
    @BindView(R.id.book_title) TextView bookTitle; 
    @BindView(R.id.book_authors) TextView bookAuthors; 

    private Unbinder mButterKnifeUnbinder; 

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

    @OnClick (R.id.book_title) 
    public void onBookTitleClicked(TextView v) { 
     // this should work 
    } 

    public void unbind() { 
     if(mButterKnifeUnbinder != null) { 
      mButterKnifeUnbinder.unbind(); 
     } 
    } 
} 

HINWEIS: Sie sollten unbind() auf onDestroy() Methode nicht aufrufen. Für , unbind() sollte onDestroyView() aufgerufen werden.

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 

    if(mViewHolder != null) { 
     mViewHolder.unbind(); 
    } 
} 
+0

ja sollte die Entbindung innerhalb onDestroyView() sein. In meinem ursprünglichen Code war es korrekt. Ich habe Code-Code getrennt geschrieben, deshalb habe ich diesen Fehler gemacht. Aber schau bitte in der Methode auf meinen Kommentar. –

+0

Sie können nicht auf Fragmentvariablen zugreifen, da die Klasse 'ViewHolder' statisch ist. Gibt es einen Grund, warum dein 'ViewHolder'' statisch' ist? Wenn Sie über Variablen auf Klassenebene verfügen, ist 'ViewHolder' eine Unterklasse und Sie können auf alle Variablen innerhalb des 'ViewHolder' zugreifen, wenn Sie sie nicht statisch machen. –

+0

Ich habe meine Antwort bearbeitet. Auf diese Weise können Sie auf alle Variablen zugreifen –

0

Zweck von ViewHolder nach meiner Frage ist nur Ansichten Referenzen zu halten, nicht auf Fragment-Variablen zugreifen. Also ich denke onClick Event sollte irgendwie zu Fragment umgeleitet werden. Dies könnte in folgender Weise erfolgen:

public class BookDetailFragment extends Fragment { 

    private ViewHolder mViewHolder; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View mFragmentView = inflater.inflate(R.layout.book_detail_view, container, false); 

     // Binding view holder 
     mViewHolder = new ViewHolder(this, mFragmentView); 

     return mFragmentView; 
    } 

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

    public void onEditButtonClicked(TextView v) { 
     // On click event comes into here 
    } 

    public void onDeleteButtonClicked(TextView v) { 
     // On click event comes into here 
    } 

    static class ViewHolder { 
     @BindView(R.id.book_title) TextView bookTitle; 
     @BindView(R.id.book_authors) TextView bookAuthors; 

     private Unbinder mButterKnifeUnbinder; 

     private BookDetailFragment mFragment; 

     public ViewHolder(BookDetailFragment fragment, View view) { 
      mFragment = fragment; 
      mButterKnifeUnbinder = ButterKnife.bind(this, view); 
     } 

     public void unbind() { 
      mButterKnifeUnbinder.unbind(); 
     } 

     @OnClick (R.id.edit_button) 
     public void onEditButtonClicked(TextView v) { 
      mFragment.onEditButtonClicked(v); 
     } 

     @OnClick (R.id.delete_button) 
     public void onDeleteButtonClicked(TextView v) { 
      mFragment.onDeleteButtonClicked(v); 
     } 
    } 
} 
0

Versuchen Sie, Ihre Methode so zu verlassen, das Entfernen der öffentlichen und die Parameter (Methoden OnClick von Buttermesser „nicht mag“ der Parameter :)):

@OnClick (R.id.book_title) 
void onBookTitleClicked() { 
     // This won't work. Is it possible to make it work with view holder class ? 
     // If I move this method into ViewHolder class I can't access fragment variables. 
} 
Verwandte Themen