Android 在BaseFragment中创建ButterKnife.bind

Android 在BaseFragment中创建ButterKnife.bind,android,butterknife,Android,Butterknife,我有基本碎片 public class BaseFragment extends Fragment { protected Unbinder unbinder; @Override public void onDestroy() { super.onDestroy(); unbinder.unbind(); } } 在这个BaseFragment中,我使用Unbinder并调用unbind();奥德斯特罗之后。但在子片段中创

我有基本碎片

public class BaseFragment extends Fragment {

    protected Unbinder unbinder;


    @Override
    public void onDestroy() {
        super.onDestroy();
        unbinder.unbind();
    }
}
在这个BaseFragment中,我使用Unbinder并调用unbind();奥德斯特罗之后。但在子片段中创建它

@Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.catigories_fragment, container, false);
        unbinder = ButterKnife.bind(this, view);
        init();
        return view;
    }
如何将unbinder创建移动到BaseFragment

如何将unbinder创建移动到BaseFragment

我宁愿保持原样,让子类在调用
onCreateView
时负责初始化
unbinder
,但是如果您真的想移动它并且
onCreateView
的实现没有改变,唯一缺少的信息是布局的id(
R.layout.catigories\u fragment
在本例中)不同的子类想要使用。解决方案可以是在
BaseFragment

 protected int getLayoutId() {
    return 0;
 }
并将其用于
充气机。充气

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
   View view = null; 
   if (getLayoutId() != 0) {
        view = inflater.inflate(getLayoutId(), container, false);
        unbinder = ButterKnife.bind(this, view);
        init();
    }
    return view;
}
和探空仪

@Override
public void onDestroy() {
    super.onDestroy();
    if (unbinder != null) {
        unbinder.unbind();
    }
}
如何将unbinder创建移动到BaseFragment

我宁愿保持原样,让子类在调用
onCreateView
时负责初始化
unbinder
,但是如果您真的想移动它并且
onCreateView
的实现没有改变,唯一缺少的信息是布局的id(
R.layout.catigories\u fragment
在本例中)不同的子类想要使用。解决方案可以是在
BaseFragment

 protected int getLayoutId() {
    return 0;
 }
并将其用于
充气机。充气

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
   View view = null; 
   if (getLayoutId() != 0) {
        view = inflater.inflate(getLayoutId(), container, false);
        unbinder = ButterKnife.bind(this, view);
        init();
    }
    return view;
}
和探空仪

@Override
public void onDestroy() {
    super.onDestroy();
    if (unbinder != null) {
        unbinder.unbind();
    }
}

这个问题已经讨论了两年,我在这里分享另一个解决方案。这个解决方案的优点是,您只需要标记需要绑定的活动或片段,绑定/解除绑定将自动进行

1.创建一个片段基类并添加一些助手

abstract class BaseFragment : Fragment() {
    var unbinder: Unbinder? = null

    fun bind() {
        unbind()
        unbinder = ButterKnife.bind(this, view!!)
    }

    fun unbind() {
        unbinder?.unbind()
        unbinder = null
    }
}
  • 声明一个接口以标识要绑定的活动/片段
  • 创建一个对象并注册活动/片段生命周期回调
  • 在应用程序子类中注册这些回调
  • 标记您的片段是可绑定的,并像往常一样使用
    Butterknife

  • 我没有为活动实现此功能,因为我不需要它,您可以自己实现。

    这个问题已经解决了两年,我在这里分享另一个解决方案。此解决方案的优点是您只需要标记需要绑定的活动或片段,绑定/解除绑定将自动发生。

    1.创建一个片段基类并添加一些助手

    abstract class BaseFragment : Fragment() {
        var unbinder: Unbinder? = null
    
        fun bind() {
            unbind()
            unbinder = ButterKnife.bind(this, view!!)
        }
    
        fun unbind() {
            unbinder?.unbind()
            unbinder = null
        }
    }
    
  • 声明一个接口以标识要绑定的活动/片段
  • 创建一个对象并注册活动/片段生命周期回调
  • 在应用程序子类中注册这些回调
  • 标记您的片段是可绑定的,并像往常一样使用
    Butterknife

  • 我没有为活动实现此功能,因为我不需要它,您可以自己实现。

    我觉得使用受保护的Unbinder Unbinder更容易(在每个子片段中创建)))是您问的
    如何将Unbinder创建移动到BaseFragment?
    是的。当然,这正是我所要求的。谢谢你的回答!在回答之后,我决定我的实现还不错。你认为将unbinder创建转移到基本片段是值得的吗?我认为这是没有意义的,但我仍然会将受保护的成员保留在基本classI中,使用受保护的unbinder unbinder要容易得多;在每个子片段中创建)是您问的
    如何将无绑定创建移动到BaseFragment?
    是的。当然,这正是我所要求的。谢谢你的回答!在回答之后,我决定我的实现还不错。您认为将无绑定创建转移到基类片段值得吗?我认为这是毫无意义的,但我仍然会将受保护的成员保留在基类中