【问题标题】:Butterknife custom view unbindButterknife 自定义视图解除绑定
【发布时间】:2016-04-22 13:14:26
【问题描述】:

打电话的最佳做法是什么:-

Butterknife.unbind()

请在自定义 Android 视图中?

【问题讨论】:

    标签: android android-view butterknife


    【解决方案1】:

    是的,onDetachedFromWindowNJ's answer 中提到的正确函数,因为这是视图不再具有绘图表面的地方。

    但是答案中错误地提到了用法。正确的做法是绑定onFinishInflate()

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        unbinder = ButterKnife.bind(this);
    }
    

    onDetachedFromWindow中解除绑定:

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        // View is now detached, and about to be destroyed
        unbinder.unbind();
    }
    

    【讨论】:

    • 在自定义视图中是否需要绑定?我没有在片段中解绑为什么我需要在视图中这样做?我只是想知道它是否需要清理或为什么要解绑?
    • @j2emanue 如果您需要清空视图和清空侦听器,那么您最好在自定义视图中调用 unbind。这不是必需的,而是推荐的方法。您还应该在 Fragment 中取消绑定。 Jake Wharton 在这里提到了原因:` 可能会出现 Fragment 的视图被破坏,但 Fragment 实例仍然存在的情况。例如,当 Fragment 进入后栈时 - onDestroyView() 被调用,但 onDestroy() 没有被调用。`来源:github.com/JakeWharton/butterknife/issues/291
    • @j2emanue 这里有更好的解释为什么要在onDestroyView(); stackoverflow.com/a/26370042/1307690 @WahibUlHaq 中取消视图我不知道你是否必须在onDetachedFromView() 中执行此操作,因为此时您的自定义视图将还不是 null,如果你在 unbind 后尝试改变它的子元素,你会得到 NullPointerException
    • 我想知道在绑定之前在oncreateview中取消绑定是否更好?
    【解决方案2】:

    试试onDetachedFromWindow()

    Unbinder unbinder;
    unbinder = Butterknife.bind(this, root);
    

    onDetachedFromWindow,您需要致电unbinder.unbind();

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        // View is now detached, and about to be destroyed
       unbinder.unbind()
    }
    

    【讨论】:

    • 这是正确的方法,但要小心,因为onDetachedFromWindow 回调不一定意味着View 即将被销毁(例如,如果它是RecyclerView 的一部分)。
    • @BartekLipinski 在 ViewHolder 中自定义视图的正确方法是什么。无法在 onDetachedFromWindow() 中调用 unbind。
    【解决方案3】:

    onDetachedFromWindow 并不总是有效,就像自定义视图在 RecyclerView 中一样。添加实际上实际上使我的应用程序崩溃了。老实说,它在没有解除绑定的情况下工作得很好。

    【讨论】:

      【解决方案4】:

      警告!

      如果您在 XML 中使用 app:attribute="value" 设置属性,则在读取时会丢失其值:

      @Override
      protected void onFinishInflate() {
          super.onFinishInflate();
          unbinder = ButterKnife.bind(this);
      
          TypedValue typedValue = new TypedValue();
          TypedArray typedArray = getContext().obtainStyledAttributes(typedValue.data, R.styleable.YourStyleable);
          try {
              int number = typedArray.getResourceId(R.styleable.YourStyleable_number, 0);
              image.setImageResource(number);
      
              String text = typedArray.getString(R.styleable.YourStyleable_text);
              text.setText(text);
          } finally {
              typedArray.recycle();
          }
      }
      

      它们的值为 0 和 null。在自定义视图的构造函数中初始化它们。

      一个原因是使用obtainStyledAttributes(typedValue.data 而不是obtainStyledAttributes(attrs

      请参阅:Magic with obtainStyledAttributes method

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-19
        • 1970-01-01
        • 1970-01-01
        • 2021-06-05
        • 1970-01-01
        • 1970-01-01
        • 2018-03-10
        相关资源
        最近更新 更多